コードの説明はこちらへどうぞ(Arduino/Processing)
▽Processingコードへ
トップに戻る
Arduino
感圧センサをアナログピンに接続
LED3つをデジタルピンに接続します。
-----コードここから-----
//ピン
const int PRE = 0; //感圧センサアナログ入力ピン
const int LED_asi = 2; //LED出力ピン
const int LED_ark = 3;
const int LED_kut = 4;
//入力
int pre; //感圧
//変数
int old_pre = 0; //前のループのpre
unsigned long timeA; //足がついた/離れた時刻
unsigned long timeB; //足がついた時刻
unsigned long old_timeB = 0; //前のループのtimeB
unsigned long timeC = 0; //足がついた/離れた時間
unsigned long timeD = 0; //足がついた時間
unsigned long old_timeD = 0; //前のループのtimeD
unsigned long timeE;
//パラメーター
int timerA = 735; //半歩分の時間(ms)
int pre_pir =80; //靴が地面から離れる瞬間の感圧センサの値
int pre_kut = 40; //靴を履いているかどうかの閾値
//出力
int asi; //足踏みをしている間1
int ark; //歩いている間1
int kan; //足の動き1周期にかかる時間(ms)
int kut; //靴を履いている間1
int ser; //シリアル通信用
int c_kan; //音楽の速度
void setup(){
Serial.begin(9600);
pinMode(LED_ark , OUTPUT);
pinMode(LED_kut , OUTPUT);
pinMode(LED_asi , OUTPUT);
}
void loop(){
//センサの値を入力
pre = analogRead(PRE) / 4;
//足踏みをしている間asiを1にする
if((old_pre > pre_pir && pre <= pre_pir) || (old_pre < pre_pir && pre >= pre_pir)){ //preが閾値を跨いだ
timeC = millis();
}
if(millis() < timeC + 100){
asi = 1;
} else {
asi = 0;
}
//歩いている間arkを1にする
if((old_pre > pre_pir & pre <= pre_pir) || (old_pre < pre_pir && pre >= pre_pir)){ //preが閾値を跨いだ
timeA = millis();
}
if(millis() < timeA + timerA){
ark = 1;
} else {
ark = 0;
}
//靴を履いている間kutを1にする
if(ark == 1 || pre > pre_kut){
kut = 1;
} else {
kut = 0;
}
//1歩の間隔を求めkanに代入
if(old_pre > pre_pir && pre <= pre_pir){ //足が地面から離れた
timeB = millis();
kan = timeB - old_timeB;
c_kan = map(kan, 500, 1100, 200, 75);
old_timeB = timeB;
}
if(old_pre < pre_pir && pre >= pre_pir){ //足が地面についた
timeD = millis();
kan = timeD - old_timeD;
c_kan = map(kan, 500, 1100, 200, 75);
old_timeD = timeD;
}
if(millis() < timeE + 3000){
c_kan = 75;
}
//変数操作
old_pre = pre;
if(kut == 1 && ark == 0){
timeE = millis();
}
//LED操作
//ark関連
if(ark == 1){
digitalWrite(LED_ark, HIGH);
} else {
digitalWrite(LED_ark, LOW);
}
//kut関連
if(kut == 1){
digitalWrite(LED_kut, HIGH);
} else {
digitalWrite(LED_kut, LOW);
}
//asi関連
if(asi == 1){
digitalWrite(LED_asi, HIGH);
} else {
digitalWrite(LED_asi, LOW);
}
//シリアル
if(c_kan < 0){
c_kan = 0;
} else if(c_kan > 255){
c_kan = 255;
}
if(Serial.available() > 0){
Serial.write(c_kan);
Serial.write(kut);
Serial.write(ark);
Serial.read();
}
delay(100);
}
-----コードここまで-----
△ページ上部へ
Processing
-----コードここから-----
//soniaというライブラリを使用します
import pitaru.sonia_v2_9.*;
import processing.serial.*;
Serial port;
//soundPlayerクラスのplayerを生成します
soundPlayer player;
//曲名
String tuneName = "shinsekaiyori.wav";
//最大速度と最大音量(今回は最大のxとy)を決めておきます
int maxSpeed;
int maxVolume;
int kut, spd, pre_kut;
int ark;
void setup()
{
size(300,300);
//初めのおまじない
Sonia.start(this);
//曲名でplayerの実体を作れます
player = new soundPlayer(tuneName);
//最大速度と最大音量の設定
maxSpeed = 150;
maxVolume = 300;
player.setVolume(150);
//シリアル通信
println(Serial.list());
String arduinoPort = Serial.list()[1];
port = new Serial(this, arduinoPort, 9600);
port.clear();
port.write(65);
}
void draw()
{
//曲を再生しているときのみ実行する
if(player.isPlaying() != 0)
{
if(ark == 1){
//曲のスピードはx座標の絶対値
player.setSpeed(spd);
} else {
player.setSpeed(75);
}
}
if(pre_kut == 0 && kut == 1){
player.play();
} else if(pre_kut == 1 && kut == 0){
player.pause();
}
pre_kut = kut;
}
//シリアル通信
void serialEvent(Serial port){
if(port.available() > 2){
spd = port.read();
kut = port.read();
ark = port.read();
port.write(65);
}
}
//終了処理
//!!!消すとパソコンにダメージがいきます!!!
void stop()
{
Sonia.stop();
super.stop();
}
-----コードここまで-----
△ページ上部へ
トップに戻る