ããã«ã¡ã¯ãENGããŽã§ãã
é³å£°åæICã§ããATP3012ïŒã¢ã¯ãšã¹ã)ã¯ã·ãªã¢ã«éä¿¡ã§éä¿¡ããæååãé³å£°ããŒã¿ã«å€æããŠåºåããããšãã§ããŸããSeeeduino XIAOã®ã·ãªã¢ã«éä¿¡ã䜿ã£ãŠä»»æã®é³å£°ãåºåãããŠåäœç¢ºèªããããšããŸãšããŠããŸãã
é³å£°åæICã¯ATP3012R5-PUïŒã¢ã¯ãšã¹ã補ïŒç§æé»åã§è³Œå ¥ïŒã䜿çšããŠããŸããåšèŸºåè·¯ã§é³å£°ãå¢å¹ ããããã«DçŽã¢ã³ãã¢ãžã¥ãŒã«ãšããŠAE-TPA2006ã¢ãžã¥ãŒã«ïŒç§æé»åïŒã䜿çšããŠããŸããäžèšèšäºã§ã¯ä»ã®ãã€ã³ã³ã䜿ã£ãŠé³å£°åçããããšããŸãšããŠããŸãã
Arduinoã©ã€ãã©ãªãšé³å£°åæICã§é³å£°ãåçãã
ãã¯ã€ã©ã€ãïŒTWELITEïŒã®ç¡ç·ã䜿ã£ãŠé éã§é³å£°åçããã
ESP32-WROOM-32Eã®ã·ãªã¢ã«éä¿¡ã§é³å£°ãåçãã
ã·ãªã¢ã«éä¿¡ã§é³å£°ãåçãã
ATP3012ã¯ããŒãåã§éä¿¡ããã·ãªã¢ã«ããŒã¿ãé³å£°ã«å€æããé³å£°åæICã§ããã¢ã¯ãšã¹ã瀟ã®é³å£°åæããã«ãŠã§ã¢ã§ããAquesTalkãArduino UNOãªã©ã§äœ¿çšãããŠãããã€ã³ã³ã«æèŒãã補åã§ãã
Arduino UNOã®ãã€ã³ã³ïŒATMEGA328PïŒã䜿çšããŠããããArduino UNOã®åºæ¿ã®ãã€ã³ã³ã眮ãæããããšã§ç°¡åã«é³å£°åºåã確èªã§ããã®ãç¹åŸŽã§ãã詳现ã¯ã¢ã¯ãšã¹ã瀟ã®HPãã確èªãã ããã
AQUEST-é³å£°åæLSIãAquesTalk pico LSIã
ATP3012ã·ãªãŒãºã䜿çšãã
ATP3012ã·ãªãŒãºã¯ã¯ãªã¹ã¿ã«ãªã©ã®çºæ¯åãå¿ èŠã§ããå¥ã·ãªãŒãºã®ATP3011ãããå èµã®çºæ¯åã§é³å£°ãåºåãããã®ããããŸãã
2ã€ã®ã·ãªãŒãºãæ¯èŒãããšATP3012ã·ãªãŒãºã®æ¹ãé³å£°ãèãåãããããšæããŠããŸãããATP3011ã§ãé³å£°ãèãåãã«ããããšã¯ãªãã®ã§éšåç¹æ°ãæžããããã®ãªãATP3011ãéžæãå°ãã§ãé³å£°ãæçã«ãããå Žåã¯ATP3012ãéžæãããšãããšæããŸãã
ATP3012ã·ãªãŒãºã«ãããŠATP3012F5ãšATP3012F6ã®ã©ã¡ããè³Œå ¥ããŠé³å£°ã確èªããŸãããATP3012F6ã®æççã®æ¹ãã¢ããŠã³ã¹ã«é©ããæãã§æ¥åçšãªã©ã«ã¯åããŠãããšæããŠããŸããATP3012F5ã¯æççãããé«ã声ãªã®ã§è¶£å³ã§éã¶åã«ã¯ATP3012F5ã®æ¹ã奜ã¿ã§ããã
ä»å䜿çšãããã³ã¯ä»¥äžã®éãã§ãã
| ãã³çªå· | æ©èœ | å 容 |
|---|---|---|
| 2 | RXD | ãã€ã³ã³ããã·ãªã¢ã«éä¿¡ãåä¿¡ããã |
| 9ã10 | XTAL1 XTAL2 | ã¯ãªã¹ã¿ã«çºæ¯åãæ¥ç¶10MHz/16MHzãå®è£ ãããã¯ãªã¹ã¿ã«ã®ä»æ§ã«ãã£ãŠã¯12-22pFã»ã©ã®ã³ã³ãã³ãµãå¿ èŠãšãªãã |
| 11 | CLK16 | åäœã¯ããã¯åãæ¿ã 16MHã䜿çšããå ŽåHIGHã«ããã |
| 13 | /PLAY | çºé³äžã«LOWã«ãªããé³å£°åçåŸ æ©äžã¯HIGHã«ãªãããHIGHã«ãªãã®ã確èªããŠåçã¹ã¿ãŒãããã |
| 15 | AOUT | é³å£°åºå端åãDçŽã¢ã³ãã¢ãžã¥ãŒã«ã§ä¿¡å·ãå¢å¹
ããŠé³å£°åçããã ã¹ããŒã«ã®å®¹éïŒæµæã®ã€ã³ããŒãã³ã¹ãé«ãïŒã«ãã£ãŠã¯çŽä»ãå¯èœ |
ä»åã¯ã·ãªã¢ã«éä¿¡ã䜿çšããŠããŸããSPIãWireïŒI2CïŒéä¿¡ã§ãé³å£°åçããããšãå¯èœã§ããArduinoç°å¢ã§ã¯Serialã©ã€ãã©ãªã§ç°¡åã«éä¿¡ã§ããããã·ãªã¢ã«éä¿¡ãããããã§ãã
PRïŒãã£ãªã¢åœ¢æã§ãæ©ã¿ã®ããªããžïŒååç¡æçžè«ã§çžè«ã§ãã[coachee]
é³å£°åçã®æ¹æ³
#define PIN_PLAY 9
void setup() {
Serial1.begin(9600); //ATP3012ã®ããã©ã«ãã®ããŒã¬ãŒã
pinMode(PIN_PLAY,INPUT_PULLUP);
Serial1.print("yorosikuonegaisimasu.\r"); //ãããããé¡ãããŸããã®é³å£°
}
Seeeduino XAIOã®ã·ãªã¢ã«1ã䜿çšããŸããSerialã¯ã·ãªã¢ã«ã¢ãã¿ã§äœ¿çšããããSerial1ã䜿çšããŠããŸããATP3012ã®ããã©ã«ãã®ããŒã¬ãŒãã9600bpsãªã®ã§9600ãæå®ããŠbegin()颿°ã§ã·ãªã¢ã«éä¿¡ãéå§ããŸãã
åçäžãåçåŸ æ©ã®ã¹ããŒã¿ã¹ãDIããŒãã§ç¢ºèªãããã9ãã³ããã«ã¢ããä»ãã®å ¥åãã³ãšããŠããŸããé³å£°ICãåšèŸºåè·¯ã®åäœãæ£åžžã§ãããã確èªãããããããããããããããŸãããã®é³å£°ãçºçãããŠããŸãã
if( digitalRead(PIN_PLAY)){ //é³å£°åŸ
æ©ãªãäžã®åŠçã§åç
switch( onseiSel.byte ){
case 0:
Serial1.print("#J.\r"); //ãã¶ãŒã鳎ãã
break;
case 1:
Serial1.print("ohayo-u.\r");
break;
case 2:
Serial1.print("konniti'wa.\r");
break;
//çç¥
else{
Serial1.print("$"); //åçãåãæ¶ã
}
倿°ã®onseiSelã®ãã¿ãŒã³ã«ãã£ãŠåçããé³å£°ãåãæ¿ããäŸã瀺ããŠããŸããé³å£°ãåçäžã§ããã°PIN_PLAYãã³ãLOWã«ãªã£ãŠããããæ¬¡ã®åçã®åŠçãè¡ããã«çŸåšåçäžã§ããã°åçãåãæ¶ãããã®ã³ãã³ããéä¿¡ããŸãã
ãã䜿ãé³å£°èšå·
ä»å䜿çšããã¢ã¯ã»ã³ããåºåãèšå·ã«ã€ããŠãŸãšããŸãããé³å£°èšå·ä»æ§ã¯ããŒã¿ã·ãŒãã«èšèŒãããŠãããã®ãäžéšæç²ããŠãŸãšããŠããŸãã
| èšå· | å 容 |
|---|---|
| .ïŒ0x2EïŒ | ç¡é³åºéãå ¥ããæã®çµããã瀺ãã |
| ?ïŒ0x3FïŒ | ç¡é³åºéãå ¥ããåã®çµãããšãªããææ«ã®å£°ãé«ãã«ãªãã |
| ;ïŒ0x3BïŒ | 次ã®ã¢ã¯ã»ã³ããé«ãé³ã§å§ããã |
| /ïŒ0x2FïŒ | ã¢ã¯ã»ã³ãã®åºåããæå®ããã |
| ‘ïŒ0x27ïŒ | ã¢ã¯ã»ã³ãèšå·ã§é³ã®é«ãããé«âäœãã«å€åããéšåã«ã€ããã |
| _ïŒ0x5FïŒ | æ¯é³ã®i,uãæ¯åã䌎ããã«çºé³ãããã ããŒã¿ã·ãŒãã®èªã¿èšå·è¡šã«å®çŸ©ãããŠããé³ã®ã¿å¯Ÿå¿ |
é³å£°èšå·ã¯åè§æåã§æå®ããŸããæåã®æšªã®ïŒïŒå ã®å€ã¯èšå·ã«å¯Ÿå¿ããã¢ã¹ããŒã³ãŒãïŒããã¹ãïŒã16鲿°ã§ç€ºãããã®ã§ãã
Serial1.print("yorosiku;onegaisima_su.\r");
Serial1.print("genki+desuka? \r");
Serial1.print("konban'wa.\r");
ã¢ã¯ã»ã³ãèšå·ãä»ããªãå Žåã¯æ£èªã¿ã«ãªã£ãŠããŸããŸãããäžæã«ã¢ã¯ã»ã³ãèšå·ãä»ãããšæ£èªã¿ãããã€ã³ãããŒã·ã§ã³ããããããªãäžèªç¶ãªé³å£°ã«ãªã£ãŠããŸããŸãã
åäœç¢ºèª

Seeeduino XIAOã®DIã4æ¬äœ¿ã£ãŠSW2ã§é³å£°ã®ãã¿ãŒã³ãåãæ¿ããŸããSW1ãæŒããšSW2ã§èšå®ããé³å£°ã®ãã¿ãŒã³ãåçããŸããã¯ãªã¹ã¿ã«çºæ¯åïŒ16MHzïŒã䜿çšããŠããŸãã12ïœ22pFã®ã³ã³ãã³ãµãæ¥ç¶ããããšãæšå¥šãããŠããŸããä»åã®åäœç¢ºèªã§ã¯ææã¡ã®ã³ã³ãã³ãµããªãã£ãã®ã§å®è£ ããŠããŸããã
TPA2006ã®/SDãå¶åŸ¡ããããšã§é³å£°ã®åºåãå¶åŸ¡ã§ããŸãã/SDãLOWã«ãããšTPA2006ãDisableïŒåäœåæ¢ïŒããŸããä»åã¯åæåæã«DOãHIGHã«ããŠå¶åŸ¡ããŠããããåžžã«ONããŠããç¶æ ã«ããŠããŸãã
ATP3012ã®15ãã³ã®AOUTéšåã«ãã€ãºé€å»ã®ããã«R1ãšC4ãå®è£ ããŠããŸããC4ã¯0.047uFçšåºŠãããŒã¿ã·ãŒãã§åè·¯äŸãšããŠç€ºãããŠããŸããææã¡ã®ãã®ããªãã£ããã0.1uFã§ä»£çšããŠããŸãã
é³å£°ã®ããªã¥ãŒã ã調æŽãããå Žåã¯C4ããTPA2006ã«åããéšåã«å¯å€æµæãå ¥ããŠä¿¡å·é»å§ã調æŽãããšããã§ãããã
ã¹ããŒã«ã®ã€ã³ããŒãã³ã¹ãé«ããã®ã§ããã°çŽæ¥æ¥ç¶ããããšãã§ããŸããã倧ããªé³ãåºãããå Žåã¯ã€ã³ããŒãã³ã¹ãäœã8ΩãŸãã¯4Ωã®ã¹ããŒã«ãæ¥ç¶ããå ŽåããããŸãã
ã€ã³ããŒãã³ã¹ãäœãã¹ããŒã«ã§å€§ããªé³ãåºãããå Žåã¯ã¢ã³ãã䜿çšããŠATP3012ã®é³å£°åºåãä¿¡å·å¢å¹ ããå¿ èŠããããŸããä»åã¯TPA2006ã䜿ã£ãŠä¿¡å·å¢å¹ ããŠããŸããTPA2006ã¯è² è·ã8Ωã§ããã°æå€§ã§1.45Wã®åºåãå¯èœãªDçŽã¢ã³ãã¢ãžã¥ãŒã«ã§ãã
SW2ã§é³å£°ã®ãã¿ãŒã³ãå€ããªããSW1ãæŒããšé³å£°ãåçãããã®ã確èªããŸããããŸãé³å£°ãåçäžã«SW1ãæŒããšåçäžã®é³å£°ã忢ããããšã確èªã§ããŠããŸãã
ãœãŒã¹ã³ãŒãå šäœ
ãœãŒã¹ã³ãŒãã¯èšäºäœææç¹ã«ãããŠåäœç¢ºèªã§ããŠããŸããã䜿çšããŠããã©ã€ãã©ãªã®æŽæ°ã«ããåäœãä¿èšŒã§ããªããªãå¯èœæ§ããããŸãããŸãããœãŒã¹ã³ãŒãã䜿çšããããšã«ãã£ãŠçããäžå©çãªã©ã®äžåã®è²¬ä»»ãè² ããããŸããåèè³æãšããŠã䜿ããã ããã
#include <TimerTC3.h>
#define PIN_DI1 0
#define PIN_DI2 2
#define PIN_DI3 3
#define PIN_DI4 4
#define PIN_DI5 5
#define PIN_PLAY 9
#define PIN_DO1 1
#define DI_WAIT_CNT 1000
#define DI_FILT_MAX 4
#define TIME_UP 0
#define TIME_OFF -1
#define BASE_CNT 10 //10msãããŒã¹ã¿ã€ããšãªã
#define FILT_MIN 1
struct DIFILT_TYP{
uint8_t wp;
uint8_t buf[DI_FILT_MAX];
uint8_t di1;
};
typedef union{
uint8_t byte;
struct {
bool di1 :1;
bool di2 :1;
bool di3 :1;
bool di4 :1;
bool di5 :1;
bool di6 :1;
bool di7 :1;
bool di8 :1;
}bit;
}DI_DATA;
// application use
bool comflg= false;
DIFILT_TYP difilt;
int8_t timdifilt = TIME_OFF;
int8_t cnt10ms;
bool btnflg1;
DI_DATA onseiSel;
bool flg;
/*** Local function prototypes */
void TimerCnt();
void mainTimer();
void DiFilter();
void setup() {
Serial.begin(115200);
Serial1.begin(9600);
pinMode(PIN_DI1,INPUT_PULLUP);
pinMode(PIN_DI2,INPUT_PULLDOWN);
pinMode(PIN_DI3,INPUT_PULLDOWN);
pinMode(PIN_DI4,INPUT_PULLDOWN);
pinMode(PIN_DI5,INPUT_PULLDOWN);
pinMode(PIN_PLAY,INPUT_PULLUP);
pinMode(PIN_DO1,OUTPUT);
digitalWrite(PIN_DO1,HIGH);
TimerTc3.initialize(1000);
TimerTc3.attachInterrupt(TimerCnt);
timdifilt = FILT_MIN;
for( uint8_t i=0; i < 10; i++ ){
mainTimer();
DiFilter();
delay(10);
}
Serial.println("start");
}
void loop() {
mainTimer();
DiFilter();
if(difilt.di1 == 0){
if(btnflg1){
btnflg1 = false;
if( digitalRead(PIN_PLAY)){
switch( onseiSel.byte ){
case 0:
Serial1.print("#J.\r");
break;
case 1:
Serial1.print("ohayo-gozaima_su.\r");
break;
case 2:
Serial1.print("konniti'wa.\r");
break;
case 3:
Serial1.print("konban'wa.\r");
break;
case 4:
Serial1.print("oyasuminasai.\r");
break;
case 5:
Serial1.print("itterasshai.\r");
break;
case 6:
Serial1.print("okaerinasai.\r");
break;
case 7:
Serial1.print("itadakima_su.\r");
break;
case 8:
Serial1.print("gotisousamadesita.\r");
break;
case 9:
Serial1.print("yorosiku;onegaisima_su.\r");
break;
case 10:
Serial1.print("denwaba'ngo-wa <NUM VAL=01-2345-6789>de_su.\r");
break;
case 11:
Serial1.print("denki+desuka? \r");
break;
case 12:
if( flg ==false ){
flg = true;
Serial1.print("aioti-kikino,sofutowokaihatusiteima_su,");
Serial1.print("waifai,moju-rutono;thuusinnwa,umakuittema_su.\r");
}
else{
flg = false;
Serial1.print("mondaiwa,hakeide-ta'nohenkannga'umakudekimasenn.");
Serial1.print("ijoude_su.\r");
}
break;
}
}
else{
Serial1.print("$"); //åçãåãæ¶ã
}
}
}
else{
btnflg1 = true;
}
}
/* callback function add */
void TimerCnt(){
++cnt10ms;
}
/* Timer Management function add */
void mainTimer(){
if( cnt10ms >= BASE_CNT ){
cnt10ms -=BASE_CNT; //10msããšã«ããã«é·ç§»ãã
if( timdifilt > TIME_UP ){
timdifilt--;
}
}
}
/* DiFilter function add */
void DiFilter(){
if( timdifilt == TIME_UP ){
difilt.buf[difilt.wp] = digitalRead(PIN_DI1);
if( difilt.buf[0] == difilt.buf[1] &&
difilt.buf[1] == difilt.buf[2] &&
difilt.buf[2] == difilt.buf[3] ){ //4åäžèŽã確èª
difilt.di1 = difilt.buf[0];
}
if( ++difilt.wp >= DI_FILT_MAX ){
difilt.wp = 0;
}
timdifilt = FILT_MIN;
onseiSel.bit.di1 = digitalRead(PIN_DI5);
onseiSel.bit.di2 = digitalRead(PIN_DI4);
onseiSel.bit.di3 = digitalRead(PIN_DI3);
onseiSel.bit.di4 = digitalRead(PIN_DI2);
onseiSel.byte &= 0x0F;
}
}
Seeeduino XIAOã¯å ±çšäœã§å®çŸ©ããæMSBã®ããããäžäœããããšããŠç«ã€ããLSBãã¡ãŒã¹ãã§ããããé 眮ãããŸããå ±çšäœã§å®çŸ©ããå Žåã¯é 眮ãéã«ãªãããæ³šæãå¿ èŠã§ãã
é¢é£ãªã³ã¯
Arduinoã®ã©ã€ãã©ãªã䜿ã£ãŠåäœç¢ºèªãè¡ã£ãããšãäžèšãªã³ã¯ã«ãŸãšããŠããŸãã
Arduinoã§åŠã¹ããã€ã³ã³ã®ãœããéçºãšæšæºã©ã€ãã©ãªã®äœ¿ãæ¹
Seeeduino XIAOã§åŠã¹ããœããéçºãšæšæºã©ã€ãã©ãªã®äœ¿ãæ¹
ESP32-WROOM-32Eã§åŠã¹ããœããéçºãšæšæºã©ã€ãã©ãªã®äœ¿ãæ¹
Raspberry Pi Picoã§åŠã¹ããœããéçº
PRïŒæè¡ç³»ã®éä¿¡æè²è¬åº§ãªãJTEX
æåŸãŸã§ãèªãã§ããã ãããããšãããããŸããã


é³å£°èšå·ãã¢ã¯ã»ã³ãèšå·ããŸã 䜿ãããªããŠããªããããé³å£°ãããã¡ãªãæãã«ãªã£ãŠããŸãããããŸã䜿ããããã«ãªããšèãåããããé³å£°ãã¿ãŒã³ãäœãããã§ãã