voice

音声合成LSI ATP3011F4-PUを使ってみる

音声合成LSI ATP3011F4-PUを用います。

組み立てたところ。左側はグラフィックディスプレイを接続するところ。上は加速度センサー。スピーカーはペットボトルのキャップにはまるサイズを使ってはめてやるとそれなりにいい音になります。
回路は右の図のようになります。 SMOD0、SMOD1はI2Cを使うのでそれぞれSMOD0=0、SMOD1=1とします。
PMOD0、PMOD1はコマンド入力モードにするのでそれぞれ1とします。この端子は内部でプルアップしてあるので何もしなくても問題ありません。写真では、チェックのためにセーフモードにしています。動作的には同じです。
配線
SCL(28番ピン)----->CPUの19番ピン
SDA(27番ピン)----->CPUの18番ピン
4.7kΩのプルアップ抵抗を忘れない
AOUT(12番ピン)----4.7kΩ---2SC1815のベース
2SC1815のコレクタ側にスピーカをつなげる
I2CVoice.cs
#define GHIE
//#define SecretLabs

using System;
using System.Threading;
using Microsoft.SPOT;
using Microsoft.SPOT.Hardware;
#if GHIE
using GHI.OSHW.Hardware;        // FEZCerberus使用のため追加、参照設定にも追加
#elif SecretLabs
using SecretLabs.NETMF.Hardware;
#endif
using BoeBotLib;

namespace BoeBotLib
{
    class I2Voice
    {
        // Set Constants for Address and Clock Frequency
        const byte LCD_ADDRESS = 0x2E; 
        const int CLOCK_FREQ = 100;
        const int TIMEOUT = 1000;

        //Write Buffer
        byte[] WriteBuffer = new byte[3];

        //Init I2C Device Config
        I2CDevice.Configuration config =
            new I2CDevice.Configuration(LCD_ADDRESS, CLOCK_FREQ);

        //Init I2C Device & LCD initialize
        I2CDevice i2c;

        public I2Voice()
        {
            i2c = new I2CDevice(config);
        }

        // 1バイトの転送
        public void write(byte data)
        {
            i2c.Execute(new I2CDevice.I2CTransaction[1] {
                I2CDevice.CreateWriteTransaction(new Byte[] {data }) }, TIMEOUT);
        }

        void wait_us(int tm)
        {
            BoeBotLib.Timer.delay(tm * 10);
        }
        void wait_ms(int tm)
        {
            BoeBotLib.CPU.delay(tm);
        }

        public void write(String str)
        {
            foreach (byte ch in str) write(ch);
            write(0x0d);
        }

        public void write(byte[] str, int n)
        {
            for (int i = 0; i < n; i++) write(str[i]);
        }
        public void write(byte[] str)
        {
            i2c.Execute(new I2CDevice.I2CTransaction[1] {
                I2CDevice.CreateWriteTransaction(str) }, TIMEOUT);
        }
        public void Write(String str)
        {
            byte[] ch = System.Text.Encoding.UTF8.GetBytes(str);
            i2c.Execute(new I2CDevice.I2CTransaction[1] {
                I2CDevice.CreateWriteTransaction(ch) }, TIMEOUT);
            write(0x0d);
        }
    }
}
 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
28 
29 
30 
31 
32 
33 
34 
35 
36 
37 
38 
39 
40 
41 
42 
43 
44 
45 
46 
47 
48 
49 
50 
51 
52 
53 
54 
55 
56 
57 
58 
59 
60 
61 
62 
63 
64 
65 
66 
67 
68 
69 
70 
71 
72 
73 
74 
75 
76 
77 
78 


Mainプログラム



Mainプログラム
using System;
using System.Threading;         // 追加
using Microsoft.SPOT;
using Microsoft.SPOT.Hardware;  // 追加、参照設定にも追加
using GHI.OSHW.Hardware;        // 追加、参照設定にも追加
using GHI.Hardware.FEZCerb;     // 追加、参照設定にも追加
using BoeBotLib;
using Pin = GHI.Hardware.FEZCerb.Pin;

namespace BoeBotLib
{
    public class Program
    {
        //      OutputPort LED1 = new OutputPort(Pin.PC0, false);
        DigitalOut LED1 = new DigitalOut(CPU.P22);
        public static void Main()
        {
            Console.setBaud();
            new Program().main();
        }
        private void main()
        {
            I2Voice voice = new I2Voice();
            while (true)
            {
                voice.Write("ashi'/ta'/no'/te'/n/kiwa/hare'/de/suga /asa'/tte'/wa/tai'/hu-'/no/rai'shu-/de/su.");
                CPU.delay(1500);
            }

        }
    }
}
 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
28 
29 
30 
31 
32