大好きなあの人の声目覚ましを作る@トラ技Jr.

トラ技Jrさんで記事を書かせていただくことになりました。

3回目の寄稿となります。

嬉しい限りです。

 

 

今回は、aitendoで売っている音声録音ICのISD1730を使って目覚し時計を作りました。

最近、沼にハマり中の”ユーリ!!! on ICE”に登場する、ヴィクトルニキフォロフの声を録音して、

設定した時間になると、音声が流れるように回路とプログラムを組みました。

参考になる資料は下記になります。

日本語マニュアル@マイクロテクニカ

公式DataSheet

 

■RTCを使った時間機能

RTCのDS1307を使って、時計機能を持たせています。

RTCは最初にArduinoを使って時間の設定をしたら、3.3Vのバックアップ電源(CR2032)をつないだままにして、

microUSBの5V電源を抜き差ししても時間の設定が消えないようにしています。

Arduinoのサンプルプログラム一覧にDS1307を使った時間設定と時間読み込みプログラムがあるのでそれを利用すると手っ取り早いです。

DS1307は秋月電商で入手できます。

DS1307@RTC

 

■16*2の液晶ディスプレイ M1602G

時計と簡単な文字列を表示するために、16列*2行のキャラクタ液晶ディスプレイを使いました。

ディスプレイのコントローラとしてST7032が使われています。

これもArduino用のライブラリをArduinoのライブラリマネージャーから入手できます。

M1602Gはaitendoで入手できます。

M1602G@液晶

 

■ISD1730を使った音声録音

ISD1730はボタン操作とSPI通信操作ができます。

どちらかの操作でしか操作できないわけではなく、どちらの操作も一緒に使えるので、

録音はボタンでして、再生はSPI操作でする、ということが可能です。

SPI操作の方が、ボタン操作よりも細かい操作をできるので、

仕様書を読んで自分のやりたいことが、どっちだと簡単にできるのかを読み解いてみてください。

ISD1730はaitendoで入手できます。

ISD1730@録音IC

 

写真と動作動画を載せます。

 

 

 

 

 

■回路図とCADデータ

以下、プログラムと、回路、CADデータはご参考まで。

ISD1700_TRG

 

 

 

■プログラム

//SET HOUR  と //SET MINUTEの部分を目覚めたい時間に変更すると使えるようになります。

綺麗なプログラムじゃないので、使うときは適宜直してください。

いっこ前の投稿でも言及していますが、注意するべき点としては、SPISettingsを使用して、ISD1700に合わせた通信設定をすることです。

SPIの同期クロックが1MHz以上だと動作サポートしていないようなので、1MHz以下のクロックで動作するように設定します。

また、SlaveSelectピンとクロックピンはアイドル状態の時はHIGHにして、MOSIピンはLOWになるように設定しておきます。

 


#include <SPI.h>
#include "ISD17XX.h"
#include <DS1307RTC.h>
#include <Time.h>
#include <TimeLib.h>
#include <Wire.h>
#include <ST7032.h>

ST7032 lcd;

SPISettings settingsA(500000, LSBFIRST, SPI_MODE3);
tmElements_t tm;
const int slavePin = 10;
char str[10];
char flag = 0;

//------SET HOUR------//
char Whour1 = 21;
char Whour2 = 22;
//--------------------//
//------SET MINUTE----//
char Wmin1 = 50;
char Wmin2 = 00;
char Wmin3 = 10;
char Wmin4 = 20;
char Wmin5 = 30;
char Wmin6 = 40;
//--------------------//

void setup() {
 // put your setup code here, to run once:
 SPI.begin();
 SPI.beginTransaction(settingsA);

 pinMode(slavePin, OUTPUT);
 digitalWrite(slavePin, HIGH);

 lcd.begin(16, 2);
 lcd.setContrast(40);
 lcd.print("hello, world!");
 Wire.begin();

 delay(1000);

 pinMode(17,OUTPUT);
 pinMode(2,INPUT);
 digitalWrite(17,HIGH);
}

void loop() {
 // put your main code here, to run repeatedly:
 char c;
 char reads[3];
 if (RTC.read(tm)) {
  Serial.print(tm.Day);
  lcd.clear();
  Serial.print("Ok, Time = ");
  lcd.print(tm.Month);
  lcd.print('/');
  lcd.print(tm.Day);
  lcd.print(' ');
  lcd.print(tm.Hour);
  lcd.print(':');
  lcd.print(tm.Minute);
  lcd.print(':');
  lcd.println(tm.Second);
  if (((tm.Hour == Whour1)|(tm.Hour == Whour2)) && ((tm.Minute == Wmin1)|(tm.Minute == Wmin2)|
    (tm.Minute == Wmin3)|(tm.Minute == Wmin4)|(tm.Minute == Wmin5)|(tm.Minute == Wmin6)) && (flag==0)) {
    sendCmd(PowerUp);
    sendCmd(Play);
    lcd.setCursor(0, 1);
    lcd.print("!!Good Morning!!");
    lcd.setCursor(0,0);
    digitalWrite(17,LOW);
    if(digitalRead(2)){
     flag = 1;
     sendCmd(Stop);
     sendCmd(PowerDown);
    }
   }else if(((tm.Hour == Whour1)|(tm.Hour == Whour2)) && ((tm.Minute == Wmin1)|(tm.Minute == Wmin2)|
    (tm.Minute == Wmin3)|(tm.Minute == Wmin4)|(tm.Minute == Wmin5)|(tm.Minute == Wmin6)) && (flag==1)){
    digitalWrite(17,HIGH);
   }else{
    flag=0;
    digitalWrite(17,HIGH);
    sendCmd(PowerDown);
    if(digitalRead(2)){
    sendCmd(PowerUp);
    sendCmd(Stop);
    sendCmd(PowerDown);
   }
  }
  delay(300);
 }else {
  lcd.print("ERROR");
 }
}

void sendCmd(int cmd) {
 char reads[2];
 char prints[100];
 digitalWrite(slavePin, LOW);
 reads[0] = SPI.transfer(cmd);
 reads[1] = SPI.transfer(0x00);
 digitalWrite(slavePin, HIGH);
 Serial.println("■---RESULT---■");
 printBits(reads[0]);
 printBits(reads[1]);
 Serial.println("■------------■");
}

void sendCmd(int cmd, int data) {
 char reads[3];
 char prints[100];
 digitalWrite(slavePin, LOW);
 reads[0] = SPI.transfer(cmd);
 reads[1] = SPI.transfer(0x00);
 reads[2] = SPI.transfer(data);
 digitalWrite(slavePin, HIGH);
 Serial.println("■---RESULT---■");
 printBits(reads[0]);
 printBits(reads[1]);
 printBits(reads[2]);
 Serial.println("■------------■");
}

void sendCmd(int cmd, int data0, int data1) {
 char reads[4];
 char prints[100];
 digitalWrite(slavePin, LOW);
 reads[0] = SPI.transfer(cmd);
 reads[1] = SPI.transfer(0x00);
 reads[2] = SPI.transfer(data0);
 reads[3] = SPI.transfer(data1);
 digitalWrite(slavePin, HIGH);
 Serial.println("■---RESULT---■");
 printBits(reads[0]);
 printBits(reads[1]);
 printBits(reads[2]);
 printBits(reads[3]);
 Serial.println("■------------■");
}

void sendCmd(int cmd, int data0, int data1, int data2) {
 char reads[5];
 char prints[100];
 digitalWrite(slavePin, LOW);
 reads[0] = SPI.transfer(cmd);
 reads[1] = SPI.transfer(0x00);
 reads[2] = SPI.transfer(data0);
 reads[3] = SPI.transfer(data1);
 reads[4] = SPI.transfer(data2);
 digitalWrite(slavePin, HIGH);
 Serial.println("■---RESULT---■");
 printBits(reads[0]);
 printBits(reads[1]);
 printBits(reads[2]);
 printBits(reads[3]);
 Serial.println("■------------■");
}

void sendCmd_APC(int cmd, int data0, int data1) {
 char reads[3];
 char prints[100];
 digitalWrite(slavePin, LOW);
 reads[0] = SPI.transfer(cmd);
 reads[1] = SPI.transfer(data0);
 reads[2] = SPI.transfer(data1);
 digitalWrite(slavePin, HIGH);
 Serial.println("■---RESULT---■");
 printBits(reads[0]);
 printBits(reads[1]);
 printBits(reads[2]);
 Serial.println("■------------■");
}

void printBits(byte myByte) {
 for (byte mask = 0x80; mask; mask >>= 1) {
  if (mask & myByte)
   Serial.print('1');
  else
   Serial.print('0');
 }
 Serial.println();
}

 


//common Command
#define PowerUp 0x01
#define Stop 0x02
#define Reset 0x03
#define ClearInt 0x04
#define ReadStatus 0x05
#define PowerDown 0x07
#define Device 0x09

//Memory Access Command
#define Play 0x40
#define Record 0x41
#define Erase 0x42
#define AllErase 0x43
#define Forward 0x48
#define ReadPlayPoint 0x06
#define ReadRecordPoint 0x08
#define SetPlayAdd 0x80
#define SetRecordAdd 0x81
#define SetEraseAdd 0x82

//Analog Configuration Command
#define ReadAPC 0x44
#define WriteAPC 0x65
#define WriteNV 0x46

//Set Address

コメントを残す

メールアドレスが公開されることはありません。