ArduinoとProcessingでIoTクッションを作りました

2019年4月22日

今回は初めて、Arduinoを使って機械的なクッションを作ってみたのでそれのメモです。(下にコード全文あります)

Arduinoとは

まず最初にArduino(アルディーノ)とはこのような小さな基盤です。

(画像はhttps://www.arduino.cc/より引用)

パソコン上でプログラミングして、それをこの機械で実行できます。

光センサーや音センサーなど様々なセンサーをつけて、その値をプログラム上で利用することができます。

本体の値段は互換機は500円くらいからと安いです。

作ったもの

「石の上にも三年」を題材にした椅子用クッションを作りました。

仕組みとしては、クッションの中に感圧センサーが埋め込まれています。その値をArduinoが取得し、座っていると判断した時だけカウントを進めるというものです。累計で3年分座ると、演出として使い始める前に録音した音声データが再生されます。録音データがタイムカプセルみたいな役割をしています。

(この仕組みだと、正確にはIotではないかもしれないです…)

実際に3年間使ってみたら、けっこう面白いと思います。

実装

プログラムはProcessing上で書きました。Minimという音を扱うライブラリが必要だったからです。

Processingはソフトの名前で、Arduinoでちょっと複雑なことをする時に必要になります。使える言語はJavaです。

ProcessingはArduinoと接続する時、ちょっとした手間が必要です。

手順としてはこうです。

  1. ArduinoをPCと接続する。
  2. ツール/シリアルポート/dev/~~usb~~を選択する。
  3. Arduinoの公式ソフトに付いているサンプルコード「Standard Firmata」を実行する。
  4. ProcessingでArduion(Firmata)というライブラリをインストールする。(初回のみ)
  5. Processingのコード上にライブラリをインポートする。
    import cc.arduino.*;
    import org.firmata.*;
    import cc.arduino.*; //ArduinoLibrary
    import processing.serial.*;
  6. Processingでポートとarudunoを宣言する。
    String arduinoPort = "/dev/cu.usbserial-〜〜〜";
    Arduino arduino;

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でもっと色々できるようになりたいと思います。

参考サイト

トボリブログさん

コード

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

ITArduino, Java

Posted by shu