AquesTalk pico ATP3011F1-PU I2C 接続の確認

今回は、Arduino UNO のマイコンから I2C で AquesTalk pico へデータを流してみたいと思います。ブレッドボードに ATP3011F1 を付けまして、Arduino UNOと電源、SCL,SDA,Reset を接続して、ATP3011F1 を I2C モードで動くように SMOD0 を落します。

テスト用音声の記号はアクエスト社の 音声記号列生成 Webサービス を利用してます。

以下のスケッチで動作確認して音声出力出来ました。

#include

#define I2CPICO 0x2E

void setup() {
Wire.begin();
}

void loop() {
delay(1000);
AquesTalkPico_Send(“kokoni yomiage’ru/te’_kisutoo nyu-ryo_kushima’_su. \r”);
AquesTalkPico_Send(“kono/o’nnseiwa akue’/su’tono/onnseikigo-re_tsuse’isei wextubusa’-bisude/hennkannshima’_shita. \r”);

while(1) {
;
}
}

void AquesTalkPico_Ready() {

while(1) {
Wire.requestFrom(I2CPICO, 1); // request 1 byte
if(Wire.available() > 0) {
if(Wire.read() == ‘>’) break;
}
delay(50); // delay 50ms
}
}

void AquesTalkPico_Send(char *msg) {
unsigned char i;
char *smsg;

smsg = msg;
AquesTalkPico_Ready();
while(*smsg != 0) {
Wire.beginTransmission(I2CPICO);
for(i = 0; i < 32; i++) { Wire.write(*smsg++); if(*smsg == 0) { break; } } Wire.endTransmission(); } } [/code]

AquesTalk pico ATP3011F1-PU 動作確認終了

今頃か? というのはさておきまして AquesTalk pico ゆっくりボイスのチップ ATP3011F1 です。秋月で売られているのは ATP3011F4 で声の種類が違うようです。

とりあえず、Arduino UNO の ATMEGA328 とこの石を差し替えしまして、簡易アンプを接続して動作確認です。なんとなくゆっくりさんぽい感じはします。F4 とは違う感じに聞こえますが知らなければどっちが発音してるかはわからないかも知れません。

お手軽にしゃべるのは時計くらいかな。EtherNet シールドがあるので NTPクライアントのサンプルはありますからLCD表示の代りにボタン叩けば時間をしゃべるというのがいいかな。

Amazon でポチったサーマルレシートプリンタ ZJ-POS58 その2

サーマルレシートプリンタ ZJ-POS58 のドライバインストールで質問がありました。正直私の家の Windows7 Home な PC は正直再インストールなどしていないものなので、最初動かないときは私の PC のほうがおかしいかな? という感じではありました。が、同様の症状かどうかはわかりかねますが単純に Setup.exe で動かないと思われる状況と思いますので私の所でうまく行ってる手順を載せておきます。

手順のサマリは、一旦 ZJ-POS58 を接続している状態でプリンタを削除、手動でプリンタの登録を実施するものです。

手順1. プリンタの削除

一度プリンタを接続し電源ONの状態で、デバイスとプリンターを開いて、ZJ-POS58 のプリンタの存在を確認する

ZJ-POS58 を右クリックして削除を選択。確認のダイアログボックで「はい」を選択して削除する

ZJ-POS58 が削除されて表示されていないことを確認

ZJ-POS58 の電源を OFF、USB ケーブルを抜いて、Generic Bulk というのが消えたことを確認する。

ZJ-POS58 の USB ケーブル接続、電源を ON をして、Generic Bulk というのが表示されたことを確認する。

手順2. プリンタの手動追加

デバイスとプリンターのウィンドウから、右クリックでプリンターの追加

ローカルプリンタを選択

プリンタのポートを選択、このとき USB001(USBの仮想プリンターポート) 注 接続している USB 接続のプリンターが他にあれば、 USB001 以外になる場合もあります。

プリンタのモデルを手動で選択

ドライバの選択では、「現在インストールされているドライバーを使う使う」

プリンタの名前は任意でいいかと思います

共有する、しないも任意でよいかと思います。

追加されたので、テスト印字

テスト印字データを送信した確認のダイアログボックスが表示される

デバイスとプリンターのウィンドウに追加された ZJ-POS58 が表示された状態になる。

という形で、私のところではうまく行ってますが、ドライバーなんかあるんですかねぇ。ちなみにこの事象以外の場合は私もどうしようもありません。

あとは追加の手順で Generic Bulk デバイスも削除、追加し直す必要があるかも知れません

追加の手順

プリンターの削除とプリンタの電源 OFF するまでの間で、USB印刷ポートの削除もやってしまう。

デバイスマネージャから、ZJ-POS58 の USB ケーブルを差した時に自動で出来るデバイスの USB 印刷サポートデバイスも削除する。これを削除するとデバイスとプリンターから Generic Bulk というデバイスも消えるハズです。このデバイスがプリンタのポートの構成で使用される USB001 とかの元になりますが、これのプロパティが違う USB のポート見てると印刷出来ないため念のため削除

これをやると、ZJ-POS58 を USB ポートに差して電源 ON 時に、[デバイスドライバをインストールしています] という吹き出しのメッセージが Windows の画面右下に一瞬表示されると思います。

これでも駄目なら、32bit/64bit間違いないことを確認して Windows よく知ってる人に調べてもらうくらいしか思い付きません。

Arduino Ethernet Shield の動作確認

朝食をいただきつつ、先日買ってきた Arduino Ethernet Shield が視線のスミにチラチラという状態。とにかく買ってきたのが壊れてないかだけでも確認ということで、ごはんの後早速セットアップ。今回は Arduino UNO R3 に Ethernet Shield を付けました。あと用意するのは PC と接続するための USB ケーブルと LAN ケーブルです。

早速 Arduino IDE を起動して、サンプルスケッチの Twitter クライアントをコピペしてコンパイル。その後書き込みをしたら自動的に Arduino はリセットがかかり再起動されます。

書き込みが終れば、Arduino IDE からシリアルモニタを起動して、何が出力されている確認。今回は

Attempting to get an IP address using DHCP:
My address:192.168.24.4
connecting to server...
making HTTP request...
>@binarylegit yes correct!

yes correct! という Tweet が表示されました。一応本当かどうか Web ブラウザからもアドレスを入力して確認です。

はい、間違い無いようですね。ということで買ってきたボードは正常と。とりあえず、セットアップ始めてこの blog 更新まで1時間かかりませんでした。便利なもんです。

Arduino Ethernet Shield 買うてきた

今日は日本橋まで行ってました。特に買い物というわけでは無くネタ探しということです。で、結局買って来たのは Arduino Ethernet Shield です。それも純正。Sparkfun だったかに1枚物のがあったように思ったのですが、たまたま無かったのでこれでもいいというというやつです。IDE のサンプルに Twitter クライアントの例などがあるようなのでまたサンプルのソース見て見ましょう。

物としては WIZNET W5100 の Ethernet アダプタで、TCP/IP のところはチップ側でやってくれます。このためマイコン側はシリアル伝送でチップとやりとりすればいいというやつです。ちょっと前までとかはカニさんチップを一生懸命たたいて動かしていたのが懐しいですね。おまけにライブラリまで提供されているので楽すぎます。

ちなみに、写真が横向きになっていますが WordPress 3.4 にしたら取り込みした写真のピクセル長いほうが横向きになります。これはうちとこだけかも知れない。

Amazon でポチったサーマルレシートプリンタ ZJ-POS58

あまり考えずにポチりました。説明に日本語も出そうなこと書いてあったし。まぁお値段も9,480円なりというやつです。

付属品はACアダプタやドキュメントやらドライバなどが入っているCD、動作確認用の感熱ロールペーパです。ちなみに付属CDROM内フォルダ名などは中文、PDFのドキュメントも中文です。ハッキリ言ってなんのこっちゃらわかりません。

んで、とりあえずバラしてみますと LM3S3J26 の ARM マイコン発見。っていじる余地が。開けただけ損という状態に。シリアル I/F のようなのがあるかと思いましたが甘かった。横のヘッダピンはプログラミン用かなと。元に戻そ。という状態でございます。USBとドロワ用のRJ-11と電源コネクタだけですね。

ドライバの Setup.exe は起動時に言語の選択が出来ますので英語にするとわかりやすいかと思います。(日本語はありません) 今回は Windows 7 Home な PC に接続してみます。そして、プリンタの登録がうまく行けばプリンタの印刷設定でしたっけ?からテストプリントしてみて出たら正解。ここで日本語出たと喜んだのもつかのま。これ描画されたイメージが印刷されているようです。

ということでテスト。メモ帳に

これは漢字テキストです。
THE QUICK BROWN FOX

の2行入れまして、メモ帳からそのまま印刷すると、レシートプリンタにも出ます。そしたら、漢字文字の手前に、ESC R 8(国際文字セット変更)を追記しまして。今度はコマンドプロンプトから print コマンドで直接出してみますと漢字出ませんでした。SHIFT-JIS, JIS に直してみたんですけどねぇ。ここらへんはもうっちょと調べてみましょうというレベル

最後はテストプリントですが左はデフォルトの中国語のモード。右はシングルバイトなモードのものです。モード切り替えは FEED 押しながら電源ONで切り替え出来ます。確かFEEDの赤LEDが消えたタイミングだったかな?です。もう少し長く押して再度赤LEDが点灯すれば HEX ダンプだったような気がしますが逆だったかも知れません。

値段はお安いのですが、工作用には実に微妙というレベルですね。これなら普通のシリアルI/F対応で日本語フォント付いてるほうがものすごく楽です。

音声合成LSI 「AquesTalk pico LSI」28pin DIP ATP3011F4-PU 買った

つい、アクエストのオンラインストアでポチってしまいました。新らしいほうのやつです。

配送はヤマト速達便でしたので、普通に郵便受けに入ってましたのです。

ATMega328 におしゃべりする機能がプログラム済みな石ですな。UARTやI2C、SPI(スレーブ)などでしゃべらせたいメッセージを投げてやると音声にしてくれます。AVR マイコンなので、Arduino uno に差してみるとか部品屋さん独自のマイコン評価ボードキットとかに差したらすぐ使えますね。

ちょこっと遊びたいたいけどネタが。天体観望とかするときに、時間しゃべらせる時計とかは重宝するのですが最近行けてないですしね。アプリケーションはのんびり考えましょう。その前に動作確認ですな。

4x4x4 LED Cube キットを作りました その2

明日は大阪(お彼岸の墓参り)で明後日はバイオリンのレッスン日と連休ですが思いのほか予定があって時間あるのは今日なのです。PCの前に座る度に、作って放置していた LED CUBE が目に入るのが気になり始めて結局のところ朝からLED CUBE のソースをいじって表示のパターンを増やしてみました。午前中やって、午後になった今動画上げたところです。もうちょっと時間あればパターン増やそうとは思いますが、一応リビングに放り出してしまいました。結構いいです。

  • LED をランダムに光らせる(パッパッと表示切り替え)
  • LED をランダムに光らせる(ゆっくりと表示切り替え)
  • 面パターンを動かす(2種類)
  • キットの標準パターン

が表示出来るようになりました。これでもコンパイルした結果は 4708 bytes だそうです。ATMega328なのでまだまだ余裕ありますね。

[nicodo]sm15687878[/nicodo]

Youtube はこちら

ソースはなんの工夫もないので秘密にすことも無く力技でこんな感じということを以下にさらしておきますわ。

/*

gallileo-7 4x4x4 LED Kit

LED Pattern modified by Masahiro Kusunoki z-gypsy @ nifty.com
2011/9/23 ver 0.1

*/

//74LS164に接続されているpinを設定
#define dPin 2
#define cPin 3

//LEDのカソードにつながっているpinを設定
int layerPin[4] = {8,9,10,11};

//LEDの表示状態を保存
int buf[4];

void setup(){

//使用するpinを設定
for(int i=0;i<4;i++){ pinMode(layerPin[i],OUTPUT); } pinMode(dPin,OUTPUT); pinMode(cPin,OUTPUT); } void loop() { int rand; clearLed(); rand = random(5); switch(rand) { case 0: pattern01(); break; case 1: pattern02(); break; case 2: pattern03(); break; case 3: pattern04(); break; case 4: pattern05(); break; } } //valの中身で初期化する void bufclear(int val){ for(int i=0;i<4;i++){ buf[i] = val; } } void bufclear2(int val1, int val2, int val3, int val4) { buf[0] = val1; buf[1] = val2; buf[2] = val3; buf[3] = val4; } //bufferを表示する gallileo-7 original code void sync(int time, int buffer[]){ int i, j, count; for(count = 0; count < time; count++){ for(i = 0; i < 4; i++) { shiftOut(dPin, cPin, MSBFIRST, (buffer[i] >> 8));
shiftOut(dPin, cPin, MSBFIRST, buffer[i]);
digitalWrite(layerPin[i], HIGH);
delayMicroseconds(500);
digitalWrite(layerPin[i], LOW);
}
}
}
void sync2(int buffer[]) {
int i, j, count;
for(count = 0; count < 3000; count++) { for(i = 0; i < 4; i++) { shiftOut(dPin, cPin, MSBFIRST, (buffer[i] >> 8));
shiftOut(dPin, cPin, MSBFIRST, buffer[i]);
j = count / 15;
switch(j) {
case 0:
case 199:
sync03(i, 0, 0);
break;
case 1:
case 198:
sync03(i, 43, 0);
break;
case 2:
case 197:
sync03(i, 86, 0);
break;
case 3:
case 196:
sync03(i, 125, 0);
break;
case 4:
case 195:
sync03(i, 161, 0);
break;
case 5:
case 194:
sync03(i, 192, 0);
break;
case 6:
case 193:
sync03(i, 217, 0);
break;
case 7:
case 192:
sync03(i, 235, 0);
break;
case 8:
case 191:
sync03(i, 246, 0);
break;
default:
sync03(i, 500, 0);
break;

}
}
}
}

void sync03(int i, unsigned int delay01, unsigned int delay02) {
digitalWrite(layerPin[i], HIGH);
if(delay01 > 0) {
delayMicroseconds(delay01);
}
digitalWrite(layerPin[i], LOW);
if(delay02 > 0) {
delayMicroseconds(delay02);
}
}

void pattern01() {
bufclear(0xFFFF);
//表示
for(int i=0;i<20;i++){ sync(50,buf); } //bufを0x00で初期化 bufclear(0x00); //ひとつずつ点灯 for(int i=0;i<4;i++){ for(int j=0;j<16;j++){ buf[i] = buf[i] << 1; buf[i] = buf[i] | 0b01; sync(50,buf); } } //ひとつずつ消灯 for(int i=0;i<4;i++){ for(int j=0;j<16;j++){ buf[i] = buf[i] << 1; sync(50,buf); } } } void pattern02() { int i; for(i = 0; i < random(10); i++) { bufclear2(random(65535),random(65535),random(65535),random(65535)); sync2(buf); } } void pattern03() { int i; for(i = 0; i < random(10); i++) { bufclear2(random(65535),random(65535),random(65535),random(65535)); sync(500, buf); } } void pattern04() { bufclear2(0xffff,0x0000,0x0000,0x0000); sync(100, buf); bufclear2(0x0000,0xffff,0x0000,0x0000); sync(100, buf); bufclear2(0x0000,0x0000,0xffff,0x0000); sync(100, buf); bufclear2(0x0000,0x0000,0x0000,0xffff); sync(100, buf); bufclear2(0x0000,0x0000,0xffff,0x0000); sync(100, buf); bufclear2(0x0000,0xffff,0x0000,0x0000); sync(100, buf); bufclear2(0xffff,0x0000,0x0000,0x0000); sync(100, buf); bufclear2(0x000f,0x000f,0x000f,0x000f); sync(100, buf); bufclear2(0x00f0,0x00f0,0x00f0,0x00f0); sync(100, buf); bufclear2(0x0f00,0x0f00,0x0f00,0x0f00); sync(100, buf); bufclear2(0xf000,0xf000,0xf000,0xf000); sync(100, buf); bufclear2(0x0f00,0x0f00,0x0f00,0x0f00); sync(100, buf); bufclear2(0x00f0,0x00f0,0x00f0,0x00f0); sync(100, buf); bufclear2(0x000f,0x000f,0x000f,0x000f); sync(100, buf); bufclear2(0x1111,0x1111,0x1111,0x1111); sync(100, buf); bufclear2(0x2222,0x2222,0x2222,0x2222); sync(100, buf); bufclear2(0x4444,0x4444,0x4444,0x4444); sync(100, buf); bufclear2(0x8888,0x8888,0x8888,0x8888); sync(100, buf); bufclear2(0x4444,0x4444,0x4444,0x4444); sync(100, buf); bufclear2(0x2222,0x2222,0x2222,0x2222); sync(100, buf); bufclear2(0x1111,0x1111,0x1111,0x1111); sync(100, buf); } void pattern05() { int i; int rand; for(i = 0; i < 12; i++) { rand = random(12); switch(rand) { case 0: bufclear2(0x1111,0x1111,0x1111,0x1111); break; case 1: bufclear2(0x2222,0x2222,0x2222,0x2222); break; case 2: bufclear2(0x4444,0x4444,0x4444,0x4444); break; case 3: bufclear2(0x8888,0x8888,0x8888,0x8888); break; case 4: bufclear2(0x000f,0x000f,0x000f,0x000f); break; case 5: bufclear2(0x00f0,0x00f0,0x00f0,0x00f0); break; case 6: bufclear2(0x0f00,0x0f00,0x0f00,0x0f00); break; case 7: bufclear2(0xf000,0xf000,0xf000,0xf000); break; case 8: bufclear2(0xffff,0x0000,0x0000,0x0000); break; case 9: bufclear2(0x0000,0xffff,0x0000,0x0000); break; case 10: bufclear2(0x0000,0x0000,0xffff,0x0000); break; case 11: bufclear2(0x0000,0x0000,0x0000,0xffff); break; } sync(100, buf); } } void clearLed() { int i; bufclear(0x00); for(i = 0; i < 20; i++) { sync(50,buf); } } [/c]

4x4x4 LED Cube キットを作りました

galileo7 さんのところで販売されている、Arduino用LED Cubeキットです。いずれにしても、LEDを空中配線するのが面倒でした。

とりあえず、サンプルのソースの点灯パターンはあくまでサンプルなのでシンプルです。よそのサイトとか見ますと 1/f ゆらぎとかいろいろアイデアがあって、参考になります。とりあえず Arduiono に慣れる練習にもなるので、この LED Cube でしばらく遊んでみようと思います。

[nicodo]sm15413951[/nicodo]

Youtube はコチラ こっちのほうが、ちょっとだけ画質上

Arduino UNO で LED チカチカ

AVR マイコンは結構前から使っていましたが、Arduino は使ったことがないので使ってみました。今回はスイッチサイエンスさんから購入しました。

外箱のシールには MADE IN ITALY と書かれております。

ボードは結構小さいです。

シールとワランティについて書かれた紙も入ってます。

んで、LED チカチカしてるとこ。

Arduino のサイト から開発環境をダウンロードすると、そこに必要なものが一式入っています。

  • Arduino UNO を USB ケーブルで PC と接続する。
  • 私の環境は Winodws 7 64bit home だったのか、ドライバが見付かりませんになる。
  • デバイスマネージャで、Arduino UNO を右クリックして、手動でドライバ更新を選ぶ
  • Arduino 開発環境のディレクトリのDriversを選択してドライバーを入れる。署名がありませんとかいう質問は無視して続行すると仮想COMポートが作成される
  • Arduino.exe を起動 Tools からボードタイプとCOMポートを選択しておく
  • File -> Examples -> Basics -> Blink を選ぶと LED チカチカのサンプルソースが表示されます。
  • 表示されたソースをコピーして、もともと表示されていた sketch ウィンドウに貼り付け
  • Sketch -> Verify / Compile でコパイル
  • File -> Upload to I/O Board で Arduino UNO へ転送。
  • 自動でリセットがかかって、アップロードしたプログラムが走り出す。

という具合で、10分くらいで終了でした。サンプルソースは13番ポートを ON/OFF させていたので、ブレッドボードにLED付けましたが、回路図見たら13番ポートにはオンボードLED付いてたので両方点滅します。

/*
  Blink
  Turns on an LED on for one second, then off for one second, repeatedly.
 
  This example code is in the public domain.
 */

void setup() {                
  // initialize the digital pin as an output.
  // Pin 13 has an LED connected on most Arduino boards:
  pinMode(13, OUTPUT);     
}

void loop() {
  digitalWrite(13, HIGH);   // set the LED on
  delay(1000);              // wait for a second
  digitalWrite(13, LOW);    // set the LED off
  delay(1000);              // wait for a second
}

今まで食わず嫌いで Arduino はさわっていませんでしたが、これはよく考えられた環境と思いました。MacOS でも開発出来るようなので、また次回やってみたいと思います。