耳grepをArduinoで

バイナリアンじゃない僕がArduinoをつかって耳grepみたいなのを作ってみた

簡単な話として,ファイルを1バイトづつArduinoに送って,Arduinoはそれを
受け取って音を鳴らす.ということです.

Arduino

ここでは,Arduino側のプログラムについて書いてます*1

int beatPin = 3;
int boudRate = 9600;
void setup(){
  Serial.begin(boudRate);
  pinMode(beatPin, OUTPUT);
}

void loop(){
  if(Serial.available() > 0){
    tone(beatPin, Serial.read()+20); // 20Hz以下は聞こえないということを思い出した
  }else{
    noTone(beatPin);
  }
}

Arduinoとは,SerialPortを用いて通信します.
はじめに通信するシリアルポートの通信速度(boudRate)と,音声出力するための
ピンの位置(beatPin)を決めます.ここでは,通信速度を9600bps,使用するピン
の位置を3としました.

loop関数内で受信したデータをtone関数で出力します.1バイトごとに入力される
ので0~255の値が周波数として出力されます*2

読ませたいファイルの送信

つぎにファイルを読み込んでArduinoに送るためのコードです.
ここではRubyを使って送ってます.

# serialsend.rb
require 'serialport'

boudRate = 9600
mySerial = SerialPort.new(ARGV.shift, boudRate, 8, 1, SerialPort::NONE)

File.open(ARGV.shift) do |f|
  sleep(1)
  while char = f.read(1)
    mySerial.putc char
  end
end

mySerial.close

使い方は,引数のはじめにArduinoを接続してるシリアルポート,2番目に読ませたい
ファイルとなっています.

ruby serialsend.rb /path/to/serial/port /path/to/file

で実行するとファイルの内容を1バイトごとに読み込んでシリアルポートに送信されて
Arduinoが受信し,音がではじめます.

まとめ

Arduino使って,ファイルをバイトごとに音ならしてみました.
バイナリアンじゃないのでただのノイズでした.
バイナリアンな方々はもう一工夫するのかな?

*1:gistに写した

*2:追記:人の可聴領域が20〜20000Hzとされてるので20追加して調整