今回は初めて、Arduinoを使って機械的なクッションを作ってみたのでそれのメモです。(下にコード全文あります)
Arduinoとは
まず最初にArduino(アルディーノ)とはこのような小さな基盤です。
(画像はhttps://www.arduino.cc/より引用)
パソコン上でプログラミングして、それをこの機械で実行できます。
光センサーや音センサーなど様々なセンサーをつけて、その値をプログラム上で利用することができます。
本体の値段は互換機は500円くらいからと安いです。
作ったもの
「石の上にも三年」を題材にした椅子用クッションを作りました。
仕組みとしては、クッションの中に感圧センサーが埋め込まれています。その値をArduinoが取得し、座っていると判断した時だけカウントを進めるというものです。累計で3年分座ると、演出として使い始める前に録音した音声データが再生されます。録音データがタイムカプセルみたいな役割をしています。
(この仕組みだと、正確にはIotではないかもしれないです…)
実際に3年間使ってみたら、けっこう面白いと思います。
実装
プログラムはProcessing上で書きました。Minimという音を扱うライブラリが必要だったからです。
Processingはソフトの名前で、Arduinoでちょっと複雑なことをする時に必要になります。使える言語はJavaです。
ProcessingはArduinoと接続する時、ちょっとした手間が必要です。
手順としてはこうです。
- ArduinoをPCと接続する。
- ツール/シリアルポート/dev/
usbを選択する。 - Arduinoの公式ソフトに付いているサンプルコード「Standard Firmata」を実行する。
- ProcessingでArduion(Firmata)というライブラリをインストールする。(初回のみ)
- Processingのコード上にライブラリをインポートする。[highlight_java] import cc.arduino.*;
import org.firmata.*;
import cc.arduino.*; //ArduinoLibrary
import processing.serial.*;
[/highlight_java] - Processingでポートとarudunoを宣言する。[highlight_java] String arduinoPort = “/dev/cu.usbserial-〜〜〜”;
Arduino arduino;
[/highlight_java]
Processingのエディタはコードの補完機能が弱いので、MicroSoft社のVSCodeというエディタを入力時は代わりに使いました。
VSCodeにProcessing Languageというプラグインを入れると、代わりに使えるようになります。
実行はProcessingのソフトに戻って左上の再生ボタンを押す感じです。
Arduinoのセンサー類のプログラムでの取得や、実際の配線など新しく学ぶことが多くありました。
一番下にコード全文を置いておきます。
Arduinoでの時間計測や、Minimライブラリを使った音声の録音再生のやり方のヒントになります。
一つ大きくハマったポイントとしてMinimライブラリがうまく動かなかったことです。音声の取得、保存時にエラーが出ました。これは音声の取得と再生の両方をSTEREOからMONOにしたら解決しました。公式のreferenceのコピペでも動かなかったので、上手くいかなかったら音声の形式を変えてみてください。(Arduinoのver.は1.8.9、Processingのver.は3.5.3です。)
おわりに
今回、Lチカって何?Lチキ?みたいな所から始めました。(LチカはLEDをプログラムを使ってチカチカさせることです。)
それでも、このプログラムは2日で仕上げることができました。
大学生になり、周りに助けてくれる方がいるおかげです。周りの環境に感謝です。
Arduinoはパソコンの画面の上のプログラムを現実世界に、現実世界の情報をセンサーを使ってプログラム上に入れることができます。
自分のプログラムが2Dから3Dに、見える形になるのは非常に楽しかったです。
今後、Arduinoでもっと色々できるようになりたいと思います。
参考サイト
http://code.compartmental.net/minim/
コード
[highlight_java]
import cc.arduino.*; //ArduinoLibrary
import processing.serial.*;
//音のライブラリ
import ddf.minim.*;
import ddf.minim.ugens.*;
String arduinoPort = “/dev/cu.usbmodem142301”;
Arduino arduino;
Minim minim;
AudioInput in;
AudioRecorder recorder;
boolean recorded;
// for playing back
AudioOutput out;
FilePlayer player;
//センサー位置、初期値指定
int PressPin = 0;
int pressPower = 0;
int LightPin = 13;
//時間測るための変数
float nowTime;
float elapsedTime = 0;
boolean isPress = false;
//感圧センサーのしきい値
int pressTrigerPoint = 10;
//三年(クリアの指定時間)
float TrigerTime = 15000;
//初期化処理
void setup(){
//時間表示
println(“elapsedTime: “+elapsedTime);
//Arduinoイニシャライズ
arduino = new Arduino(this, arduinoPort, 57600);
//ピンの要素取得
arduino.pinMode(PressPin, Arduino.INPUT);
arduino.pinMode(LightPin, Arduino.OUTPUT);
//録音
size(512, 200, P3D);
minim = new Minim(this);
in = minim.getLineIn(Minim.MONO, 2048);
recorder = minim.createRecorder(in, “myrecording.wav”);
// get an output we can playback the recording on
out = minim.getLineOut( Minim.MONO );
textFont(createFont(“Arial”, 12));
}
//ループ処理
void draw(){
pressPower = arduino.analogRead(PressPin);
// println(“pressPower: “+pressPower);
//押しているかどうかで分岐
if(pressPower > pressTrigerPoint){
if(isPress == false){
nowTime = millis();
isPress = true;
//光って押すしたの知らせる(log)
arduino.digitalWrite(LightPin, Arduino.HIGH);
}
}else{
if(isPress == true){
elapsedTime += millis() – nowTime;
//時間表示
println(“elapsedTime: “+elapsedTime);
//光って押してないの知らせる(log)
arduino.digitalWrite(LightPin, Arduino.LOW);
isPress = false;
}
//録音系
background(0);
stroke(255);
for(int i = 0; i < in.left.size()-1; i++) { line(i, 50 + in.left.get(i)*50, i+1, 50 + in.left.get(i+1)*50); line(i, 150 + in.right.get(i)*50, i+1, 150 + in.right.get(i+1)*50); } if ( recorder.isRecording() ) { text(“Now recording, press the r key to stop recording.”, 5, 15); } else if ( !recorded ) { text(“Press the r key to start recording.”, 5, 15); } else { text(“Press the s key to save the recording to disk and play it back in the sketch.”, 5, 15); } } //三年経ったら(クリア時) if(elapsedTime > TrigerTime){
if(player != null && out != null){
player.patch( out );
player.play();
}
elapsedTime = 0;
}
// //ピカピカ処理
// arduino.digitalWrite(LightPin, Arduino.HIGH);
// delay(1000);
// arduino.digitalWrite(LightPin, Arduino.LOW);
// delay(1000);
}
//録音時のキーボード操作
void keyReleased()
{
if ( !recorded && key == ‘r’ )
{
if ( recorder.isRecording() )
{
recorder.endRecord();
recorded = true;
}
else
{
recorder.beginRecord();
}
}
if ( recorded && key == ‘s’ )
{
if ( player != null )
{
player.unpatch( out );
player.close();
}
player = new FilePlayer( recorder.save() );
// player.patch( out );
// player.play();
}
}
[/highlight_java]