<?xml version="1.0" encoding="utf-8" ?>
<feed version="0.3" xml:lang="ja" xmlns="http://purl.org/atom/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/"><title>N.Yamazaki&apos;s blog</title><link rel="alternate" type="text/html" href="http://blog-yama.a-quest.com/" /><modified>2012-01-23T23:38:37+09:00</modified><tagline>主に音声合成について思ったことを書いてみようと思います。</tagline><generator url="http://jugem.jp/">JUGEM</generator><entry><title>[AquesTalk pico LSI] ATP3011F4とATP3010F4の違い</title><link rel="alternate" type="text/html" href="http://blog-yama.a-quest.com/?eid=970140" /><id>http://blog-yama.a-quest.com/?eid=970140</id><issued>2012-01-23T19:04:00+09:00</issued><modified>2012-01-23T14:21:27Z</modified><created>2012-01-23T10:04:00Z</created><summary>

ATP3011F4-PUは、音声合成LSI AquesTalk picoの新バージョンです。ATP3010F4からの主な変更点は次のとおりです。電源電圧2.5Vから動作するようになりました。(ATP3010F4は3.8Vから)クロック外付発振子から内蔵クロックにし、外付け部品をなくしました。スリープ機能SL...</summary><author><name>nyaqu</name></author><dc:subject>AquesTalk pico LSI</dc:subject><content mode="escaped" type="text/html" xml:lang="ja"><![CDATA[<img src="http://www.a-quest.com/img/atp3011f4-pu.jpg" border="0" height="180" width="450">
<br>
<br><a href="http://www.a-quest.com/products/atp3011f4-pu.html" target="_blank">ATP3011F4-PU</a>は、音声合成LSI AquesTalk picoの新バージョンです。<br><a href="http://www.a-quest.com/products/atp3010f4.html" target="_blank">ATP3010F4</a>からの主な変更点は次のとおりです。<br><br><ul><li>電源電圧<br>2.5Vから動作するようになりました。(ATP3010F4は3.8Vから)<br><br></li><li>クロック<br>外付発振子から内蔵クロックにし、外付け部品をなくしました。<br><br></li><li>スリープ機能<br>SLEEP端子をLOWにすることで待機時消費電流を1μA程度まで下げることができます。</li></ul><br>なお、内蔵クロックの精度が良くないため、UARTのボーレートは自動調整となりました。<br>ボーレート設定には、<span style="color: rgb(255, 0, 0);">通信に先立ち、ホストから'?'を送信する必要があります</span>。ATP3010F4から置換の場合は、ご注意ください。<br>]]></content></entry><entry><title>[Arduino] AquesTalk pico LSI を SPI で制御する</title><link rel="alternate" type="text/html" href="http://blog-yama.a-quest.com/?eid=970139" /><id>http://blog-yama.a-quest.com/?eid=970139</id><issued>2011-12-27T16:06:00+09:00</issued><modified>2011-12-27T08:09:37Z</modified><created>2011-12-27T07:06:00Z</created><summary>&amp;nbsp;音声合成LSI 「AquesTalk pico LSI」 (ATP3010F4)は、UARTの他にI2CやSPIのインターフェースを持っています。一方、Arduino側のUARTは、PCとの通信で既に使われているので、ArduinoとAquesTalk pico LSI間の通信には、I2CやSPIを利用するのが便利です。ココまでは、...</summary><author><name>nyaqu</name></author><dc:subject>AquesTalk pico LSI</dc:subject><content mode="escaped" type="text/html" xml:lang="ja"><![CDATA[&nbsp;音声合成LSI 「AquesTalk pico LSI」 (<a href="http://www.a-quest.com/products/atp3010f4.html" target="_blank">ATP3010F4</a>)は、UARTの他にI2CやSPIのインターフェースを持っています。<br>一方、Arduino側のUARTは、PCとの通信で既に使われているので、ArduinoとAquesTalk pico LSI間の通信には、I2CやSPIを利用するのが便利です。<br>ココまでは、<a href="../?eid=970138" target="_blank">前回(I2C)</a>と同じ。<br><br>今回は、SPIを使ってAquesTalk pico LSIを動かす方法を示します。<br><br><span style="text-decoration: underline;">配線</span><br><br><a href="http://img.blog-yama.a-quest.com/20111227_2432042.png"><img src="http://img.blog-yama.a-quest.com/20111227_2432042_t.png" alt="" class="pict" width="300" height="222"></a><br><br>通信モードをSPI(Mode0)にするため <span style="font-style: italic;">SMOD0</span>(4pin), <span style="font-style: italic;">SMOD1</span>(5pin)をGNDに接続、<br>ATP3010F4とArduinoのSPI接続は次のとおり。<br><blockquote>SCK(19pin)&nbsp;&nbsp; &lt;-&gt; D13<br>
MISO(18pin) &lt;-&gt; D12<br>
MOSI(17pin) &lt;-&gt; D11<br>
/SS(16pin)&nbsp;&nbsp;&nbsp; &lt;-&gt; D10<br>
</blockquote><br><span style="text-decoration: underline;">サンプルスケッチ</span><br><br>このスケッチは、予めプログラムに用意した複数のメッセージを順番に読み上げるものです。<br><br>注意点が3つあります。<br>1. スレーブセレクト（/SS）は、独自に実装する必要があります。<br>今回のスケッチでは、Arduinoのpin10をこれに割り当てて、転送の開始時にLowに、終了後にHiにするようにしています。<br><br>2. SPIのバイト転送毎に10μsec以上間隔をあける必要があります。これはATP3010F4の制限によるものです。<br><br>3. 発声の終了はポーリングで確認する必要があります。<br>ダミーデータ0xFFを送って'&gt;'が返るのを待ちます。<br>なお、ポーリングの間隔は10ms以上あけてください。<br><br><blockquote>/////////////////////////////////<br>// aqtkpico_spi - SPI通信で AquesTalk Pico LSIを操作するArdionoスケッチ<br>//&nbsp;&nbsp;&nbsp; &nbsp;<br>// by N.Yamazaki AQUEST Corp.&nbsp; &lt;http://www.a-quest.com&gt;<br><br>#include &lt;SPI.h&gt;<br><br>// pin10をSPIのスレーブセレクト端子(SS)とする 配線に応じて変更可<br>const int slaveSelectPin = 10;<br><br>// ローマ字音声記号列<br>//&nbsp;&nbsp;&nbsp; &nbsp;コマンドの最後のCR('&yen;r')を忘れずに<br>const char *TblKoe[] = &#123;<br>"konnnichiwa&yen;r",<br>"yukkurisiteittene&yen;r",<br>"akuesuto-ku/pi'ko ba-jyonn &lt;ALPHA =01a&gt;.&yen;r",<br>"dennwaba'nngo-wa &lt;NUMS VAL=01-2345-6789&gt;desu.&yen;r",<br>"&lt;NUMK VAL=16 COUNTER=di&gt;;&lt;NUMK VAL=5 COUNTER=funn&gt;/&lt;NUMK VAL=35 COUNTER=byo-&gt;desu.&yen;r",<br>"#J&yen;r", // チャイム音J<br>"#K&yen;r", // チャイム音K<br>&#125;;<br><br>void setup()<br>&#123;<br>&nbsp;&nbsp;&nbsp; // pin10を出力に設定<br>&nbsp;&nbsp;&nbsp; pinMode (slaveSelectPin, OUTPUT);<br><br>&nbsp;&nbsp;&nbsp; // SPIの初期化<br>&nbsp;&nbsp;&nbsp; SPI.begin(); <br>&nbsp;&nbsp;&nbsp; SPI.setClockDivider(SPI_CLOCK_DIV16); // 最大クロックは1MHz(16MHz/16)<br>&nbsp;&nbsp;&nbsp; SPI.setBitOrder(MSBFIRST);&nbsp;&nbsp;&nbsp; // MSBファースト<br>&nbsp;&nbsp;&nbsp; SPI.setDataMode(SPI_MODE0);&nbsp;&nbsp;&nbsp; // SPIモード0&nbsp;&nbsp;&nbsp; SMOD1:0 SMOD0:0<br>//&nbsp;&nbsp;&nbsp; SPI.setDataMode(SPI_MODE3); // SPIモード3&nbsp;&nbsp;&nbsp; SMOD1:0 SMOD0:1<br><br>&nbsp;&nbsp;&nbsp; Serial.begin(9600);<br>&#125;<br><br>void loop()<br>&#123;<br>&nbsp;&nbsp;&nbsp; int iret;<br>&nbsp;&nbsp;&nbsp; for(int iMsg=0; iMsg&lt;sizeof(TblKoe)/sizeof(char*); iMsg++)&#123;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // Ready待ち<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; iret = Pico_WaitReady();<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(iret==0)&#123;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Serial.print("OK&yen;n");<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &#125;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; else &#123; // Error<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Serial.print('E');<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Serial.print(iret);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Serial.print('&yen;n');<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &#125;<br><br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // コマンド送出<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Pico_Synthe(TblKoe[iMsg]); <br>&nbsp;&nbsp;&nbsp; &#125;<br>&#125;<br><br>/////////////////////////////<br>// Picoにコマンド送信<br>// 音声合成開始&nbsp;&nbsp;&nbsp; 引数に音声記号列を指定<br>// コマンド送出後、発声の終了を待たずに戻る<br>void Pico_Synthe(const char *koe)<br>&#123;<br>&nbsp;&nbsp;&nbsp; // SS端子をLOWに<br>&nbsp;&nbsp;&nbsp; digitalWrite(slaveSelectPin,LOW);<br><br>&nbsp;&nbsp;&nbsp; const char *p = koe;<br>&nbsp;&nbsp;&nbsp; for(;*p!=0;)&#123;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Pico_SPI_trans(*p++);<br>&nbsp;&nbsp;&nbsp; &#125;<br><br>&nbsp;&nbsp;&nbsp; // SS端子をHIに<br>&nbsp;&nbsp;&nbsp; digitalWrite(slaveSelectPin,HIGH);<br>&#125;<br><br>/////////////////////////////<br>// PicoがRedyになるのを待つ<br>// コマンドが受信可能な状態（音声合成の終了）になるのを待つ<br>// return 0:正常終了 それ以外：エラー(エラーコード）<br>int Pico_WaitReady()<br>&#123;<br>&nbsp;&nbsp;&nbsp; int iret=0;<br><br>&nbsp;&nbsp;&nbsp; // SS端子をLOWに<br>&nbsp;&nbsp;&nbsp; digitalWrite(slaveSelectPin,LOW);<br><br>&nbsp;&nbsp;&nbsp; for(;;)&#123;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; byte c = Pico_SPI_trans(0xff); // 0xffはダミーデータ<br><br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;//!!&nbsp; '&yen;r'後の最初の応答は常に'*'になるという制約有り<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(c=='&gt;')&nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; else if(c=='*' || c==0xff)&#123;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // スレーブが処理中なのでしばらく放っておく<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; delay(10);&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // ポーリング間隔は10ms以上<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &#125;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; else if(c=='E')&#123; // 何らかのエラーを返した<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; char sErr[4];<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; sErr[0] = Pico_SPI_trans(0xff);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; sErr[1] = Pico_SPI_trans(0xff);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; sErr[2] = Pico_SPI_trans(0xff);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; sErr[3]=0;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; iret = atoi(sErr);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &#125;<br>&nbsp;&nbsp;&nbsp; &#125;<br>&nbsp;<br>&nbsp;&nbsp;&nbsp; // SS端子をHIに<br>&nbsp;&nbsp;&nbsp; digitalWrite(slaveSelectPin,HIGH);<br>&nbsp;&nbsp;&nbsp; return iret;<br>&#125;<br><br>/////////////////////////////<br>// SPI で1バイトの転送（双方向）<br>byte Pico_SPI_trans(byte c)<br>&#123;<br>&nbsp;&nbsp;&nbsp; delayMicroseconds(20);// バイト毎の転送間隔は10usec以上必要<br>&nbsp;&nbsp;&nbsp; return SPI.transfer(c);<br>&#125;<br></blockquote><br><br><br><span style="text-decoration: underline;">応用</span><br><br>ここでは、Arduino側の/SS端子をpin10にしましたが、他の端子でもかまいません。変更した場合は、スケッチの <span style="font-style: italic;">slaveSelectPin</span> の値もそれに合わせて変更してください。<br><br>SPIのクロックは1MHz以下であれば良いので、スケッチの<span style="font-style: italic;"> SPI_CLOCK_DIV16</span> を <span style="font-style: italic;"> SPI_CLOCK_DIV32</span> や<span style="font-style: italic;"> SPI_CLOCK_DIV64 にしても構いません。<br><br>SPIMode0 </span>の代わりにSPIモード3を使う場合は、スケッチの<span style="font-style: italic;">SPI_MODE0</span>を<span style="font-style: italic;">SPI_MODE3</span>に変更し、<span style="font-style: italic;">SMOD0</span>端子はオープンにします。<br><br>]]></content></entry><entry><title>[Arduino] AquesTalk pico LSI を I2C で制御する</title><link rel="alternate" type="text/html" href="http://blog-yama.a-quest.com/?eid=970138" /><id>http://blog-yama.a-quest.com/?eid=970138</id><issued>2011-12-26T12:38:00+09:00</issued><modified>2011-12-27T08:12:09Z</modified><created>2011-12-26T03:38:00Z</created><summary>音声合成LSI 「AquesTalk pico LSI」 (ATP3010F4)は、UARTの他にI2CやSPIのインターフェースを持っています。一方、Arduino側のUARTは、PCとの通信で既に使われているので、ArduinoとAquesTalk pico LSI間の通信には、I2CやSPIを利用するのが便利です。今回は、I2Cを使っ...</summary><author><name>nyaqu</name></author><dc:subject>AquesTalk pico LSI</dc:subject><content mode="escaped" type="text/html" xml:lang="ja"><![CDATA[音声合成LSI 「AquesTalk pico LSI」 (<a href="http://www.a-quest.com/products/atp3010f4.html" target="_blank">ATP3010F4</a>)は、UARTの他にI2CやSPIのインターフェースを持っています。<br>一方、Arduino側のUARTは、PCとの通信で既に使われているので、ArduinoとAquesTalk pico LSI間の通信には、I2CやSPIを利用するのが便利です。<br><br>今回は、I2Cを使ってAquesTalk pico LSIを動かす方法を示します。<br>(SPIを使う場合は<a href="../?eid=970139" target="_blank">こちら</a>）<br><br><span style="text-decoration: underline;">配線</span><br><br><a href="http://img.blog-yama.a-quest.com/20111226_2430322.png"><img src="http://img.blog-yama.a-quest.com/20111226_2430322_t.png" alt="" class="pict" width="400" height="366"></a><br><br>通信モードをI2CにするためSMOD0(4pin)をGNDに接続、<br>I2C通信のSCL(28pin)をArduinoのA5に、SDA(27pin)をA4に接続します。<br>また、このSCLとSDAは、4.7KΩ程度でプルアップ（VCCに接続）します。<br><br><span style="text-decoration: underline;">サンプルスケッチ</span><br><br>このスケッチは、予めプログラムに用意した複数のメッセージを順番に読み上げるものです。<br><br>注意点は、ArduinoのWireライブラリが１度に32byteまでしか送信できない制限があるようです(arduino-022）。<br>また、I2Cでは発声の完了が通知されないので、ポーリングで確認する必要があります。<br>そして、ATP3010F4の制限によりポーリングの間隔は10ms以上あけて行います。<br><br>実際の応用では、動的にメッセージの単語を入れ替えたり、さまざまな数値を読ませるのも良いと思います。<br>特に数値に関しては、単位（助数詞）を指定することで「一本、二本、三本」を「いっぽん、にほん、さんぼん」などと、読みやアクセントを正しく読む機能を持っていますので、是非ご利用ください。このあたりの詳しくは、<a href="http://www.a-quest.com/download/manual/atp3010f4_datasheet.pdf" target="_blank">データシート</a>の音声記号列仕様に書いてあります。<br><br><span style="color: rgb(255, 0, 0);">追記 2011/12/27 </span><br style="color: rgb(255, 0, 0);"><span style="color: rgb(255, 0, 0);">下記ソースはArduino 0023のもので、Arduino 1.0の場合は次のように変更してください。</span><br style="color: rgb(255, 0, 0);"><blockquote style="color: rgb(255, 0, 0);">Wire.send()&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; -&gt; Wire.write()<br>Wire.recieve()&nbsp;&nbsp;&nbsp; -&gt; Wire.read()<br></blockquote><br><br>/////////////////////////////////<br>// aqtkpico_i2c - I2C通信で AquesTalk Pico LSIを操作するArdionoスケッチ<br>//&nbsp;&nbsp; <br>// by N.Yamazaki AQUEST Corp.&nbsp; &lt;http://www.a-quest.com&gt;<br><br>#include &lt;Wire.h&gt;<br>#define I2C_ADDR_PICO 0x2E // PicoのデフォルトのI2Cアドレス<br><br>// ローマ字音声記号列<br>//&nbsp;&nbsp; コマンドの最後のCR('&yen;r')を忘れずに<br>const char *TblKoe[] = &#123;<br>"konnnichiwa&yen;r",<br>"yukkurisiteittene&yen;r",<br>"akuesuto-ku/pi'ko ba-jyonn &lt;ALPHA =01a&gt;.&yen;r",<br>"dennwaba'nngo-wa &lt;NUM VAL=01-2345-6789&gt;desu.&yen;r",<br>"&lt;NUMK VAL=16 COUNTER=di&gt;;&lt;NUMK VAL=5 COUNTER=funn&gt;/&lt;NUMK VAL=35 COUNTER=byo-&gt;desu.&yen;r",<br>"#J&yen;r", // チャイム音J<br>"#K&yen;r", // チャイム音K<br>&#125;;<br><br>void setup()<br>&#123;<br>&nbsp;&nbsp;&nbsp; Wire.begin();&nbsp; // Arduino側をI2C Masterとして初期化<br>&#125;<br><br>void loop()<br>&#123;<br>&nbsp;&nbsp;&nbsp; for(int iMsg=0; iMsg&lt;sizeof(TblKoe)/sizeof(char*); iMsg++)&#123;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Pico_WaitReady();&nbsp; // Ready待ち<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Pico_Synthe(TblKoe[iMsg]); // 発声コマンド送出<br>&nbsp;&nbsp;&nbsp; &#125;<br>&#125;<br><br>// Picoにコマンド送信<br>// 音声合成開始&nbsp;&nbsp;&nbsp; 引数に音声記号列を指定<br>void Pico_Synthe(const char *koe)<br>&#123;<br>&nbsp;&nbsp;&nbsp; // Wireの制約で、一度に送れるのは32byteまで<br>&nbsp;&nbsp;&nbsp; // AquesTalk picoへは一度に128byteまで送れるので、<br>&nbsp;&nbsp;&nbsp; // Wire.beginTransmission()〜Wire.endTransmission()を複数回に分けて呼び出す<br>&nbsp;&nbsp;&nbsp; const char *p = koe;<br>&nbsp;&nbsp;&nbsp; for(;*p!=0;)&#123;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Wire.beginTransmission(I2C_ADDR_PICO);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // Wireの制約で、一度に送れるのは32byteまで<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; for(int i=0;i&lt;32;i++)&#123;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Wire.send(*p++);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(*p==0) break;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &#125;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Wire.endTransmission(); // 実際はこのタイミングで送信される<br>&nbsp;&nbsp;&nbsp; &#125;<br>&#125;<br><br>// PicoがRedyになるのを待つ<br>// コマンドの受信可能な状態（音声合成の終了）を待つ<br>int Pico_WaitReady()<br>&#123;<br>&nbsp;&nbsp;&nbsp; for(;;)&#123;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Wire.requestFrom(I2C_ADDR_PICO, 1);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(Wire.available()&gt;0)&#123;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; byte c = Wire.receive();<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(c=='*' || c==0xFF) delay(10); // Busy応答は10msec以上待つ必要がある<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; else if(c=='&gt;')&nbsp;&nbsp;&nbsp; break;&nbsp;&nbsp;&nbsp; // Ready応答<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &#125;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; else &#123; // NOACK または応答がなかった時<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // Picoが動いていない可能性が高い<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return 1; //ERR<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &#125;<br>&nbsp;&nbsp;&nbsp; &#125;<br>&nbsp;&nbsp;&nbsp; return 0;&nbsp; // OK<br>&#125;<br><br><br><br>]]></content></entry><entry><title>AquesTalk pico LSI 販売開始</title><link rel="alternate" type="text/html" href="http://blog-yama.a-quest.com/?eid=970137" /><id>http://blog-yama.a-quest.com/?eid=970137</id><issued>2011-12-16T18:00:00+09:00</issued><modified>2011-12-16T09:03:33Z</modified><created>2011-12-16T09:00:00Z</created><summary>おまたせしました！AquesTalk pico LSI(ATP3010F4)、オンライン販売の開始です。といっても、本格的な製造・販売体制が整っていないため個数限定となります。売り切れの際はご了承下さい。 Make: での先行発売同様、セラロック付きです。価格は送料込みで 1,575円　(配送...</summary><author><name>nyaqu</name></author><dc:subject>AquesTalk pico LSI</dc:subject><content mode="escaped" type="text/html" xml:lang="ja"><![CDATA[おまたせしました！<br><br>AquesTalk pico LSI(ATP3010F4)、オンライン販売の開始です。<br>といっても、本格的な製造・販売体制が整っていないため個数限定となります。<br>売り切れの際はご了承下さい。 <br><br>Make: での先行発売同様、セラロック付きです。<br>価格は送料込みで 1,575円　(配送はクロネコメール便速達のみ）。<br>また、数量割引は用意できていません m_ _m<br><br>ご購入は、以下のサイトから<br><a href="http://cart03.lolipop.jp/LA02182251/?mode=ITEM2&amp;p_id=PR00102179432" target="_blank">Aquest Onlne Store</a><br><br><br><br><br>]]></content></entry><entry><title>AquesTalk pico LSIの次の販売は</title><link rel="alternate" type="text/html" href="http://blog-yama.a-quest.com/?eid=970136" /><id>http://blog-yama.a-quest.com/?eid=970136</id><issued>2011-12-06T22:47:00+09:00</issued><modified>2011-12-27T08:14:13Z</modified><created>2011-12-06T13:47:00Z</created><summary>先日のMake:Tokyo MeetingでのAquesTalk pico LSIの先行発売は、おかげ様で20〜30分のあっという間に完売しました。ご購入いただいた方、ありがとうございます。是非、使った感想をお寄せ下さいね。一方で、多くの方々には折角お越しいただきながら売り切れでごめんなさい...</summary><author><name>nyaqu</name></author><dc:subject>AquesTalk pico LSI</dc:subject><content mode="escaped" type="text/html" xml:lang="ja"><![CDATA[先日のMake:Tokyo MeetingでのAquesTalk pico LSIの先行発売は、おかげ様で20〜30分のあっという間に完売しました。<br><br>ご購入いただいた方、ありがとうございます。是非、使った感想をお寄せ下さいね。<br>一方で、多くの方々には折角お越しいただきながら売り切れでごめんなさい。<br><br>本格的な販売にはまだ少し時間がかかりそうなので、急遽、追加で１ロット手作業で作って販売することにしました。この販売時期に関しては、まだ部品の仕入れの段階なので未確定ですが、今月中旬頃にはなんとかするよう頑張ります！ 次回も、シールが貼ってあるなど手作り感たっぷりの予定ですので、お手柔らかによろしくお願い致します。<br><br>発売時期に関してお知らせするメーリングリストを作成しましたので、よろしければご登録ください。発売前にメールでお知らせいたします。<br><br>■ML参加方法<br>join-aquestalk_pico_lsi.fsjF[あっと]ml.freeml.com に空メール （[あっと]を@に換えてください）。<br>あとは返信メールのURLにアクセス 。<br>なお、「マイページの作成」を促されますが、このMLに関しては不要です。<br>※メールアドレスは管理者も含めて非公開で参加する設定にしてあります。<br><br><span style="color: rgb(255, 0, 0);">追記：12月16日〜 販売を開始しました。</span><a href="../?eid=970137" target="_blank">こちら</a><span style="color: rgb(255, 0, 0);">を参照</span><br>]]></content></entry><entry><title>もしATP3010F4の動作が不安定だったら</title><link rel="alternate" type="text/html" href="http://blog-yama.a-quest.com/?eid=970135" /><id>http://blog-yama.a-quest.com/?eid=970135</id><issued>2011-12-05T18:57:00+09:00</issued><modified>2011-12-05T10:24:50Z</modified><created>2011-12-05T09:57:00Z</created><summary>音声合成LSI&amp;nbsp; AquesTalk pico（ATP3010F4）の実装時の注意点です。なんとなく動いているようでもすぐ動かなくなるとか、とても変な音がするなど・・・OkibiWorksLaboさんが、早速ブログに、その対策について書かれております。症状時の音声もあって大変参考になりま...</summary><author><name>nyaqu</name></author><dc:subject>AquesTalk pico LSI</dc:subject><content mode="escaped" type="text/html" xml:lang="ja"><![CDATA[音声合成LSI&nbsp; <a href="http://www.a-quest.com/products/atp3010f4.html" target="_blank">AquesTalk pico（ATP3010F4）</a>の実装時の注意点です。<br><br>なんとなく動いているようでもすぐ動かなくなるとか、とても変な音がするなど・・・<br><br>OkibiWorksLaboさんが、早速ブログに、その対策について書かれております。<br>症状時の音声もあって大変参考になりますので、是非ご覧ください。<br><br>熾火研究所＊電子工作室：　<a href="http://d.hatena.ne.jp/OkibiWorksLabo/20111204/aquestalkpico" name="aquestalkpico">ATP3010F4 がうまく動作しない場合の傾向と対策について。</a><br><br>クロックの配線については<a href="http://www.a-quest.com/download/manual/atp3010f4_datasheet.pdf" target="_blank">データシート</a>にも書いてありますが、音声出力端子(AOUT)の影響を受けやすいので、AOUTに低い入力インピーダンスのアンプ等を使うときは特に注意してください。<br>ちなみに、絶対最大定格は40mAですからね！！<br><br><br>]]></content></entry><entry><title>AquesTalk pico LSI を使った Arduino 音声合成シールドの作成</title><link rel="alternate" type="text/html" href="http://blog-yama.a-quest.com/?eid=970134" /><id>http://blog-yama.a-quest.com/?eid=970134</id><issued>2011-12-01T18:13:00+09:00</issued><modified>2011-12-01T11:15:15Z</modified><created>2011-12-01T09:13:00Z</created><summary>先に、Arduinoを音声合成ボードに変えるというのをやりましたが、今回は、Arduino用の音声合成シールドを作ってみます。AquesTalk pico LSI ATP3010F4は、Arduino unoと同じATmega328pマイコンを使っていますが、ここにArduinoのスケッチを書きこんでオリジナルのArduino...</summary><author><name>nyaqu</name></author><dc:subject>AquesTalk pico LSI</dc:subject><content mode="escaped" type="text/html" xml:lang="ja"><![CDATA[先に、<a href="http://jp.makezine.com/blog/2011/11/aques_talk_pico_lsi.html" target="_blank">Arduinoを音声合成ボードに変える</a>というのをやりましたが、<br>今回は、Arduino用の音声合成シールドを作ってみます。<br><br>AquesTalk pico LSI ATP3010F4は、Arduino unoと同じATmega328pマイコンを使っていますが、ここにArduinoのスケッチを書きこんでオリジナルのArduino作品を作るなんてことはもちろんできません。そのためオリジナル作品を作るには、ArduinoボードとAquesTalk pico LSIがそれぞれ必要になり、これらを配線する必要があります。<br><br>Arduinoの世界では、無線LANとかSDカードなど機能を拡張するハードをシールドって呼ぶらしく、通常は基板になっていてArduinoボードに挿して簡単に使えるようにようになっています。<br>しかし、今回は基板ではなく、ICを亀の子のように2段に重ねて実装します。<br>部品点数も少ないですからね。<br><br>ArduinoのAVRマイコンと、AquesTalk pico LSIはI2Cシリアル通信で接続します。<br>I2Cは最小限の2線での通信できますので、ほとんどのポートをそのままアプリに使用することができます。UARTは、Arduino側のスケッチを書き込む時に使うので、pico LSIと同時に使用することはできません。<br><br>出力はトランジスタ1つのシンプルなアンプでスピーカを駆動します。<br><span style="color: rgb(255, 0, 0);"></span><br><br>シールド部分で必要な部品は、これだけ。右下の黒いのはスピーカを接続するための端子で、DIPソケットを2端子だけに切断したものです。<br><a href="http://img.blog-yama.a-quest.com/20111201_2399073.jpg"><img src="http://img.blog-yama.a-quest.com/20111201_2399073_t.jpg" alt="" class="pict" width="200" height="150"></a><br><ul><li>ATP3010F4(AquesTalk pico LSI)</li><li>セラロック(16MHz)</li><li>2SC1815</li><li>4.7KΩ</li><li>DIPソケット（2端子分）</li></ul><br>回路図は、こんな感じ。アンプ部はかっこ良く言えばフルデジタルアンプ！？<br><span style="color: rgb(255, 0, 0);">スピーカ端子は、片側がVCCにつながっているので他の装置には繋げられません！</span><br><a href="http://img.blog-yama.a-quest.com/20111201_2399117.png"><img src="http://img.blog-yama.a-quest.com/20111201_2399117_t.png" alt="" class="pict" width="200" height="125"></a><br><br><font style="font-weight: bold;" size="3"></font><span style="font-weight: bold;">■製作</span><br><br><ol><li>不要な端子をカット<br>ATP3010F4の2,3,5,6,11,13,14,15,16,17,18,19,21,23,24,25,26pin、覚悟を決めて根元からニッパで切断。<br><a href="http://img.blog-yama.a-quest.com/20111201_2399074.jpg"><img src="http://img.blog-yama.a-quest.com/20111201_2399074_t.jpg" alt="" class="pict" width="200" height="150"></a><br></li><li>ジャンパーを配線<br>SMOD0(pin4)はGNDに落とすのでGND(22pin)に配線。<br><a href="http://img.blog-yama.a-quest.com/20111201_2399076.jpg"><img src="http://img.blog-yama.a-quest.com/20111201_2399076_t.jpg" alt="" class="pict" width="200" height="150"></a><br></li><li>セラロックを載せる<br>セラロックはGNDが中央のピンなので、あらかじめこんな感じで加工しておく。<br><a href="http://img.blog-yama.a-quest.com/20111201_2399075.jpg"><img src="http://img.blog-yama.a-quest.com/20111201_2399075_t.jpg" alt="" class="pict" width="200" height="150"></a><br><br>セラロックをつけた後<br><a href="http://img.blog-yama.a-quest.com/20111201_2399077.jpg"><img src="http://img.blog-yama.a-quest.com/20111201_2399077_t.jpg" alt="" class="pict" width="200" height="150"></a><br></li><li>トランジスタと抵抗を載せる<br>トランジスタは、先に、位置を決めて瞬間接着剤でLSIにつけたほうが作業しやすい。ベースは抵抗を介して、AOUT(12pin)に接続する。エミッタはGND(22pin)に接続。コレクタはそのまま。<br><a href="http://img.blog-yama.a-quest.com/20111201_2399078.jpg"><img src="http://img.blog-yama.a-quest.com/20111201_2399078_t.jpg" alt="" class="pict" width="200" height="150"></a><br></li><li>SP端子を接続してシールドの完成！<br>SP端子を瞬間接着剤でLSIの端に接着。<br>片側をトランジスタのコレクタに、もう一方を、LSIの裏にジャンパーを這わせてVCC(7pin)に配線。<br><a href="http://img.blog-yama.a-quest.com/20111201_2399079.jpg"><img src="http://img.blog-yama.a-quest.com/20111201_2399079_t.jpg" alt="" class="pict" width="200" height="150"></a><br><a href="http://img.blog-yama.a-quest.com/20111201_2399080.jpg"><img src="http://img.blog-yama.a-quest.com/20111201_2399080_t.jpg" alt="" class="pict" width="200" height="150"></a><a href="http://img.blog-yama.a-quest.com/20111201_2399081.jpg"><img src="http://img.blog-yama.a-quest.com/20111201_2399081_t.jpg" alt="" class="pict" width="200" height="150"></a></li><li>あとは、Arduinoのマイコンに重ねる。<br>Arduinoのマイコンの上にATP3010F4をのせて、1,7,8,20,22,27,28pin同士をハンダ付け。<br><a href="http://img.blog-yama.a-quest.com/20111201_2399083.jpg"><img src="http://img.blog-yama.a-quest.com/20111201_2399083_t.jpg" alt="" class="pict" width="200" height="150"></a><a href="http://img.blog-yama.a-quest.com/20111201_2399084.jpg"><img src="http://img.blog-yama.a-quest.com/20111201_2399084_t.jpg" alt="" class="pict" width="200" height="150"></a></li></ol>以上で、ハードウェアは完成です。この状態でも通常のArduinoの使い方ができます。<br>試しにサンプルスケッチBlinkでLEDが点滅するか確認してみましょう。<br><br>次回は、これを用いて、I2Cの通信をしながら音声合成を行うプログラム（スケッチ）を、簡単なアプリと共に紹介します。<br><br>]]></content></entry><entry><title>新しい音声合成LSIのデータシート</title><link rel="alternate" type="text/html" href="http://blog-yama.a-quest.com/?eid=970133" /><id>http://blog-yama.a-quest.com/?eid=970133</id><issued>2011-11-18T00:31:00+09:00</issued><modified>2011-11-17T15:36:05Z</modified><created>2011-11-17T15:31:00Z</created><summary>&amp;nbsp;Make: Tokyo Meeting 07 で先行販売予定の新しい音声合成LSIの仕様を公開しました。興味をお持ちの方は、覗いてみてください。そのページ下部にデータシートのリンクもあります。音声合成LSI&amp;nbsp;&amp;nbsp;&amp;nbsp; ATP3010F4</summary><author><name>nyaqu</name></author><dc:subject>AquesTalk pico LSI</dc:subject><content mode="escaped" type="text/html" xml:lang="ja"><![CDATA[&nbsp;Make: Tokyo Meeting 07 で先行販売予定の新しい音声合成LSIの仕様を公開しました。<br>興味をお持ちの方は、覗いてみてください。<br>そのページ下部にデータシートのリンクもあります。<br><br><a href="http://www.a-quest.com/products/atp3010f4.html" target="_blank">音声合成LSI&nbsp;&nbsp;&nbsp; ATP3010F4</a><br>]]></content></entry><entry><title>AquesTalk pico LSIの紹介動画</title><link rel="alternate" type="text/html" href="http://blog-yama.a-quest.com/?eid=970132" /><id>http://blog-yama.a-quest.com/?eid=970132</id><issued>2011-11-09T17:05:00+09:00</issued><modified>2011-11-09T14:51:15Z</modified><created>2011-11-09T08:05:00Z</created><summary>&amp;nbsp;AquesTalk pico LSI &quot;ATP3010F4&quot;の紹介ビデオ（その１）です。最も簡単な実装として、Arduino UNO 基板を利用した方法です。
このLSIの仕様は、近いうちに公開します。ちなみに、Make: Tokyo Meeting 07では、このLSIを展示・即売します。

</summary><author><name>nyaqu</name></author><dc:subject>AquesTalk pico LSI</dc:subject><content mode="escaped" type="text/html" xml:lang="ja"><![CDATA[&nbsp;AquesTalk pico LSI "ATP3010F4"の紹介ビデオ（その１）です。<br><br>最も簡単な実装として、Arduino UNO 基板を利用した方法です。
<br>このLSIの仕様は、近いうちに公開します。<br>ちなみに、Make: Tokyo Meeting 07では、このLSIを展示・即売します。<br><br>
<iframe src="http://www.youtube.com/embed/p9rTu4J5sjc?rel=0" allowfullscreen="" width="560" frameborder="0" height="315"></iframe>
<br><br>]]></content></entry><entry><title>AVR Studio5.0 には stk500.exe が入っていない！</title><link rel="alternate" type="text/html" href="http://blog-yama.a-quest.com/?eid=970131" /><id>http://blog-yama.a-quest.com/?eid=970131</id><issued>2011-10-20T00:08:00+09:00</issued><modified>2011-10-19T15:18:26Z</modified><created>2011-10-19T15:08:00Z</created><summary>&amp;nbsp;AVRチップのプログラム（Flashを焼く意）にstk500.exe を使おうとしたら、どこにも見つからない。どうやらAVR Studio5.0 には stk500.exe が入っていないようだ。入手先：http://www.atmel.no/beta_ware/AVRCommandLineTools/AVRCommandLineTools.zip展開後、AVRCom...</summary><author><name>nyaqu</name></author><dc:subject>その他</dc:subject><content mode="escaped" type="text/html" xml:lang="ja"><![CDATA[&nbsp;AVRチップのプログラム（Flashを焼く意）にstk500.exe を使おうとしたら、どこにも見つからない。どうやらAVR Studio5.0 には stk500.exe が入っていないようだ。<br><br>入手先：<br><a href="http://www.atmel.no/beta_ware/AVRCommandLineTools/AVRCommandLineTools.zip" target="_blank">http://www.atmel.no/beta_ware/AVRCommandLineTools/AVRCommandLineTools.zip</a><br><br>展開後、AVRCommandLineTools.exe を実行してインストール。<br>デフォルトインストールでは、<br>C:&yen;Program Files&yen;Atmel&yen;AVR Tools&yen;Stk500 <br>にstk500.exeが入っているはず。<br><br>ただし、このままstk500.exeを実行すると、libelfdwarfparser.dll が無いと怒られたので、隣のフォルダ（Stk600）から当該DLLをコピーして、一件落着。<br><br><br><br>]]></content></entry><entry><title>AquesTalk pico リリースとその開発の背景</title><link rel="alternate" type="text/html" href="http://blog-yama.a-quest.com/?eid=970130" /><id>http://blog-yama.a-quest.com/?eid=970130</id><issued>2011-10-18T23:48:00+09:00</issued><modified>2011-10-19T00:41:11Z</modified><created>2011-10-18T14:48:00Z</created><summary>新しい日本語規則音声合成エンジン 「AquesTalk pico」 をリリースしました。- 処理量とRAMサイズがAquesTalk2の１/10に -開発の背景AquesTalk(2)自体もかなり軽量であり、パソコンや携帯電話のプラットフォームでは、まったく負荷を気にせずに実装できますし、システム規...</summary><author><name>nyaqu</name></author><dc:subject>AquesTalk</dc:subject><content mode="escaped" type="text/html" xml:lang="ja"><![CDATA[<span style="font-weight: bold;">新しい日本語規則音声合成エンジン 「AquesTalk pico」 をリリースしました。</span><br>- 処理量とRAMサイズがAquesTalk2の１/10に -<br><br><br><span style="font-weight: bold;">開発の背景</span><br><br>AquesTalk(2)自体もかなり軽量であり、パソコンや携帯電話のプラットフォームでは、まったく負荷を気にせずに実装できますし、システム規模の小さい家電製品などの場合には多少のチューニングを施すことで実装しています。<br><br>ところで、音声合成というものは所詮１つの情報出力手段、マン・マシンインターフェースのアウトプットの一手法に過ぎないわけで、このような観点から眺めると、音声合成というのは他のLEDや液晶といったものと比べると、まだまだ使いにくい技術だと思うのです。<br><br>実際にシステムに音声合成機能を追加するときは、音声波形を生成しながら音声出力するための割り込みを処理を追加しなければならないし、他のソフトモジュールとの同期やら、クリティカルパスでの実行処理が間に合うか、･･･など多くの検討や検証が必要となります。<br><br>音声合成をもっと簡単に使ってもらうには、やはりLCDモジュールのように、物理的にも独立した一つの部品にして、システム側からは単にデータを与えるだけで音声出力するのが一番ではないかと･･･<br><br>というわけで、最終的に目指すところはLCDモジュールの感覚で使える音声合成モジュールです。そのためには、コスト面で、AquesTalk(2)をさらに小型化する必要があったというわけです。<br><br>音声合成のアルゴリズムってのは、基本的に大量の小数点の積和演算で構成され、精度もそこそこ必要です。AquesTalk(2)ではこれを固定小数点演算にするなど工夫して、16bit環境でも動かせるようにしていました。<br>しかし、さらに小型軽量化するためには、抜本的にアルゴリズムを見直さなければなりませんでした。また、当初から安価な8bitCPU環境でも動かせるようにと、ゼロベースで研究開発を進め、ようやく出来上がったのが下記仕様の AquesTalk pico なのです。<br><br><br><span style="font-weight: bold;">AquesTalk pico 仕様</span><br>
<blockquote><ul><li>CPU： 8bit 4MHz以上</li><li>最小RAMサイズ: 500byte</li><li>最小ROMサイズ: 23Kbyte</li><li>入力： ローマ字表記音声記号列</li><li>出力： 8KHzサンプリング,16bitPCM</li><li>声種：女声１種（今後追加予定）
</li></ul></blockquote><br>
今後の目標は、これをハードウェア化（ようは1チップ化）し、コスト面でLCDモジュールなどに対抗できるようにしていくことです！<br><br><br>]]></content></entry><entry><title>Make: Tokyo Meeting 07 出展予告</title><link rel="alternate" type="text/html" href="http://blog-yama.a-quest.com/?eid=970129" /><id>http://blog-yama.a-quest.com/?eid=970129</id><issued>2011-10-18T11:17:00+09:00</issued><modified>2011-10-18T02:36:50Z</modified><created>2011-10-18T02:17:00Z</created><summary>Make:Japan MTM07 - ”ゆっくり声”の新音声合成LSI - (株)アクエスト軽量さで高い評価を受けてきた「AquesTalk」音声合成エンジンが、さらに1/10に小さくなって「AquesTalk pico」として新登場。これを、Make:ファンにお馴染みの8bitマイコンに実装しました。このLSIを使え...</summary><author><name>nyaqu</name></author><dc:subject>AquesTalk pico LSI</dc:subject><content mode="escaped" type="text/html" xml:lang="ja"><![CDATA[<a href="http://jp.makezine.com/blog/2011/12/mtm07.html" target="_blank">Make:Japan MTM07</a> - ”ゆっくり声”の新音声合成LSI - (株)アクエスト<br><br>軽量さで高い評価を受けてきた「AquesTalk」音声合成エンジンが、さらに1/10に小さくなって「<a href="http://www.a-quest.com/products/aquestalk.html" target="_blank">AquesTalk pico</a>」として新登場。<br>これを、Make:ファンにお馴染みの8bitマイコンに実装しました。<br>このLSIを使えば、だれでも簡単に音声出力が実現できることでしょう。<br>ブースでは、リアルタイムの音声合成デモと、数量限定でこのLSIの販売も行う予定 <br>です。<br><br><br><a href="http://img.blog-yama.a-quest.com/20111018_2333654.jpg"><img src="http://img.blog-yama.a-quest.com/20111018_2333654_t.jpg" alt="" class="pict" width="200" height="150"></a><br>]]></content></entry><entry><title>Make: Tokyo Meeting 07 出展</title><link rel="alternate" type="text/html" href="http://blog-yama.a-quest.com/?eid=970128" /><id>http://blog-yama.a-quest.com/?eid=970128</id><issued>2011-10-16T11:55:00+09:00</issued><modified>2011-10-16T02:58:42Z</modified><created>2011-10-16T02:55:00Z</created><summary>&amp;nbsp;Make:Tokyo Meeting 07 [2011年12月3日(土)-4日(日) 東京工業大学 大岡山キャンパス]に出展します。詳細はまた...</summary><author><name>nyaqu</name></author><dc:subject>AquesTalk pico LSI</dc:subject><content mode="escaped" type="text/html" xml:lang="ja"><![CDATA[<a href="http://jp.makezine.com/blog/2011/12/mtm07.html" target="_blank">&nbsp;Make:Tokyo Meeting 07</a> [2011年12月3日(土)-4日(日) 東京工業大学 大岡山キャンパス]に出展します。<br><br>詳細はまた...<br>]]></content></entry><entry><title>I2C マスタ・レシーバで可変長のデータを送受信するには？</title><link rel="alternate" type="text/html" href="http://blog-yama.a-quest.com/?eid=970127" /><id>http://blog-yama.a-quest.com/?eid=970127</id><issued>2011-10-04T09:29:00+09:00</issued><modified>2011-10-04T01:53:42Z</modified><created>2011-10-04T00:29:00Z</created><summary>AVRでI2Cの通信を実装してる最中、可変長のデータを転送する方法でちょっと悩んだ。I2Cの仕様では、「Start条件からStop条件間の１回の転送で伝送できるバイト数には制限がなく、何バイトでも送ることができます。」とある。これ自体は何ら問題がない。転送するデータ長（...</summary><author><name>nyaqu</name></author><dc:subject>その他</dc:subject><content mode="escaped" type="text/html" xml:lang="ja"><![CDATA[AVRでI2Cの通信を実装してる最中、可変長のデータを転送する方法でちょっと悩んだ。<br><br>I2Cの仕様では、「Start条件からStop条件間の１回の転送で伝送できるバイト数には制限がなく、何バイトでも送ることができます。」とある。これ自体は何ら問題がない。<br><br>転送するデータ長（バイト数）が固定でなく、応答に応じて変化する場合は、ACKかNOACKを返すことにより転送の打ち切りを示すことが出来る。これもAgree.<br><br>この辺のことは、<a href="http://www.technochips.co.jp/TechTips/I2CDOC/i2c3.html" target="_blank">こちら</a>にとてもわかりやすくまとまっている。<br><br>上記で１つ問題になるのは、マスタ・レシーバ状態、すなわちスレーブ側からマスタにデータ転送する場合にスレーブ側から転送を終了するモードである。<br><br>例えば、スレーブ側が可変長の文字列をマスタに返すことを考えてみる。<br>返される文字列の長さはマスターは知らず、スレーブしか知らない。<br>このような使用例は沢山あると思うのだが…<br><br>マスタ・レシーバのデータ転送中に<span style="font-weight: bold;">ACK/NOACKを返すのは常にマスタ</span>であるので、スレーブ側はNOACKを返すこともできず、ひたすらマスタからの要求に従って結果を返し続けなくてはならない。<br><br>一体、どうすれば良いのだろう？<br><br><a href="http://www.nxp.com/documents/other/39340011_jp.pdf" target="_blank">I2Cの仕様書</a>を見てみたが、やっぱりわからない。<br><br>あれこれ実験してみたが、そこは省略。<br><br>最終的には、<br>スレーブは、最後のデータを送信した後は0xFFしか返さないように実装。<br>マスタは、受信で0xFFが返ってきたら、もうデータが無いと判断して、Stop条件で転送を完了するように実装する。<br><br>特に0xFFでなくても良いのだが、スレーブが応答しないときもSDAがHiに張り付いて0xFFになるので、これに合わせるのが順当だろう。<br><br>なお、この方法では0xFFが特殊な意味に使われてしまうので、バイナリデータ転送では使えない。この場合には、データの最初にデータ長を指定するなどの方法で対処するしかなさそうだ。<br><br>いずれにせよ、もっとスマートな方法は無いのだろうか？<br><br><br><br><br>]]></content></entry><entry><title>AVRマイコン プログラムでEEPROMが読めても書けなかったのは</title><link rel="alternate" type="text/html" href="http://blog-yama.a-quest.com/?eid=970126" /><id>http://blog-yama.a-quest.com/?eid=970126</id><issued>2011-09-21T15:22:00+09:00</issued><modified>2011-09-21T06:30:49Z</modified><created>2011-09-21T06:22:00Z</created><summary>AVR Studio環境にてAVRマイコンのプログラミング中、データシートのサンプルコード（C言語）に従ってEEPROMのデータを書き換えようとしたところ、読み出しは出来るのだが、書き込みが行われない現象が生じた。実機でもシミュレータでも同じ症状。原因は・・・なんてことな...</summary><author><name>nyaqu</name></author><dc:subject>その他</dc:subject><content mode="escaped" type="text/html" xml:lang="ja"><![CDATA[AVR Studio環境にてAVRマイコンのプログラミング中、<br>データシートのサンプルコード（C言語）に従ってEEPROMのデータを書き換えようとしたところ、読み出しは出来るのだが、書き込みが行われない現象が生じた。<br>実機でもシミュレータでも同じ症状。<br><br>原因は・・・<br><br>なんてことない。<br>コンパイラの最適化がオプションが外れていて、<br><blockquote>EECRレジスタのEEPMEビットを「1」にセットしてから4クロック以内にEECRレジスタのEEPEビットを「1」にセット<br></blockquote>というのが間に合っていなかった。<br>コンパイラの最適化オプションを設定して解決。<br>「XXクロック以内」って条件が書かれていたら、アセンブラを確認したほうが良さそうだ。<br><br><br>]]></content></entry></feed>
