TentoBug が 2026年01月17日23時49分07秒 に編集
初版
タイトルの変更
SPRESEMSEで、なんとも言えない音
タグの変更
SPRESENSE
メイン画像の変更
記事種類の変更
製作品
Lチカの変更
本文の変更
# はじめに 2025年SPRESENSE活用コンテストに参加してみようと思いましたが・・・・。経過を記録しておこうと思い書き出しました。 目標はサブコアとPWMを使って、エンタメ部門っぽい作品と思っていました。 結果としましては、sin波が、作れませんでした。 中途半端ですが、提出します。 設計図をもとにして、ブレッドボードに部品を配置します。 Aruduino IDEでソースコードをMainCoreとSubCore1に書き込みます。なんとも言えない音がなります。USBはつけた状態で、SW1AをONにします。LEDがついて少し音が変わります。 MainCoreのloop()のs8の8を1や2にして、書き込むと、なんとも言えない音がなります。 # 部品 | 記号 | 名称 | 備考 | |:---:|:---:|:---:| |U2、U3| メインボード | SPRESENSE | |U1| 圧電素子 | 村田製作所 | # 設計図  # ソースコード ```arduino:MainCore #include <MP.h> int8_t msgid=0x01; uint32_t msgdata=440;//300000; int subid=1; //サブコア1で波を作成 void nami(){ pinMode(23, OUTPUT); digitalWrite(23,LOW);//異常音量? MP.end(1); MP.begin(1); msgdata+=100; if(msgdata>800)msgdata=300; MP.Send(msgid,msgdata,subid); } void setup() { pinMode(1, OUTPUT); pinMode(21, INPUT); digitalWrite(1, LOW); Serial.begin(921600); Serial.setTimeout(1000); Serial.println("main"); nami(); } int sw21=0,bsw21=0; void loop() { // パソコンからのデータを受信 int re=Serial.read(); switch (re){ case '1': nami(); break; } sw21=digitalRead(21); if(sw21==true){ digitalWrite(1, HIGH); if(bsw21==false)nami(); }else{ digitalWrite(1, LOW); } bsw21=sw21; } ``` ```arduino:SubCore1 #include <MP.h> int8_t msgid; uint32_t msgdata; int subid; int ret=0; unsigned int duty; double w=0,t=0.0; void setup() { MP.begin(); Serial.begin(921600); MP.RecvTimeout(MP_RECV_POLLING); do{ ret=MP.Recv(&msgid,&msgdata); }while(ret!=msgid); duty=msgdata; w=2.0*PI*(double)msgdata; // w=1.0; Serial.println(msgdata); pinMode(23, OUTPUT); } void s1(){ double y,v=50.0; y=v*cos(w*t); digitalWrite(23,HIGH); delayMicroseconds((y/2.0+v/2.0) ); digitalWrite(23,LOW); delayMicroseconds( (v-(y/2.0+v/2.0)) ); t+=0.0000001; if( t > (1.0/(double)msgdata) ) t=0.0; } void s2(){ digitalWrite(23,HIGH); delayMicroseconds(1000);//1000 500Hz digitalWrite(23,LOW); delayMicroseconds(1000); } void s3(){ double y,v=50.0; digitalWrite(23,HIGH); delayMicroseconds( (unsigned int) (1.0/(double)msgdata*1000000.0/2.0) ); digitalWrite(23,LOW); delayMicroseconds( (unsigned int) (1.0/(double)msgdata*1000000.0/2.0) ); } void s4(){ double y,v=50.0; y=v*cos(w*t); digitalWrite(23,HIGH); delayMicroseconds( (unsigned int) (1.0/(double)msgdata*1000000.0/2.0) ); digitalWrite(23,LOW); delayMicroseconds( (unsigned int) (1.0/(double)msgdata*1000000.0/2.0) ); t+=0.0000001; if( t > (1.0/(double)msgdata) ) t=0.0; } void s5(){ double y,v=1000.0; y=v*cos(w*t); digitalWrite(23,HIGH); delayMicroseconds((y/2.0+v/2.0) ); digitalWrite(23,LOW); delayMicroseconds( (1/(double)msgdata-(y/2.0+v/2.0)) ); t+=(1.0/(double)msgdata/(double)v); if( t > (1.0/(double)msgdata) ) t=0.0; } void s6(){ double y,v=1.0/(double)msgdata*1000000; y=v*cos(w*t)+v/2.0; digitalWrite(23,HIGH); delayMicroseconds( (unsigned int)(y/10.0) ); digitalWrite(23,LOW); delayMicroseconds( (unsigned int)((v-y)/10.0) ); t+=(1.0/(double)msgdata/1000.0 );// if( t > (1.0/(double)msgdata) ) t=0.0; } void s7(){ double y,v=1.0/(double)msgdata*1000000; y=t; digitalWrite(23,HIGH); delayMicroseconds( (unsigned int) y ); digitalWrite(23,LOW); delayMicroseconds( (unsigned int) (v-y) ); t+=1; if( t > v ) t=0.0; } void s8(){ double y,v=1.0/(double)msgdata*1000000; y=v*cos(w*t); digitalWrite(23,HIGH); delayMicroseconds( (unsigned int) y ); digitalWrite(23,LOW); delayMicroseconds( (unsigned int) (v-y) ); t+=0.000001; if( t > v ) t=0.0; } void loop() { s8(); } ```