TentoBugのアイコン画像
TentoBug 2026年01月17日作成
製作品 製作品 Lチカ Lチカ 閲覧数 15
TentoBug 2026年01月17日作成 製作品 製作品 Lチカ Lチカ 閲覧数 15

SPRESEMSEで、なんとも言えない音

はじめに

2025年SPRESENSE活用コンテストに参加してみようと思いましたが・・・・。経過を記録しておこうと思い書き出しました。
目標はサブコアとPWMを使って、エンタメ部門っぽい作品と思っていました。
結果としましては、sin波が、作れませんでした。
中途半端ですが、提出します。

設計図をもとにして、ブレッドボードに部品を配置します。
Aruduino IDEでソースコードをMainCoreとSubCore1に書き込みます。なんとも言えない音がなります。USBはつけた状態で、SW1AをONにします。LEDがついて少し音が変わります。
MainCoreのloop()のs8の8を1や2にして、書き込むと、なんとも言えない音がなります。

部品

記号 名称 備考
U2、U3 メインボード SPRESENSE
U1 圧電素子 村田製作所

設計図

キャプションを入力できます

ソースコード

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; }

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(); }
TentoBugのアイコン画像
テントウ虫も好きなのですが、違います。アマチュアとしてプログラムを書くので、バグや虫が10個以上はあります。誤記脱字も多いところからつけた名前です。回路やプログラムも怪しいのを掲載していて、動作を保証できませんがヨロシクお願いします。
ログインしてコメントを投稿する