はじめに
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
さんが
2026/01/17
に
編集
をしました。
(メッセージ: 初版)
ログインしてコメントを投稿する