『U.N.オーエンは彼女なのか?』を演奏改良版

疲れたから本文なしで。許してヒヤシンス

説明はニコ動の投コメみて(そっちもテキトーだけど)

 

 

 

圧電ブザーで『U.N.オーエンは彼女なのか?』のようなものを演奏してみた

 

 

どーもです。

 

RaspberryPiのIOピン制御にWiring Piというライブラリを利用したら、物凄く簡単に制御することができるようになりました。

ライブラリに頼ってばかりではいけないのはわかっていますが・・・

 

さて、ソースコードはこんな感じです。

予め配列intervalに使う音程の周波数を入れておき、関数noteを使ってnote(音程番号, ○分音符);という感じでmain関数に楽譜を手打ちしていきます。

とりあえず動作させることを優先したため、「え゛っ!?」と思うような部分もあると思いますが、そのへんは無視してくださいw

 

ちなみに、RaspberryPiにはもちろんArch Linuxを入れてあります。

#include <stdio.h>
#include <string.h>
#include <wiringPi.h>
#include <softTone.h>

#define PIN 0
#define TEMPO 1500

int interval[19] = {523, 587, 659, 698, 739, 830, 932, 1046, 1109, 1244, 1397, 1567, 1760, 1975, 2093, 0, 622, 784, 1318};

void note(int scale, int time)
{
  softToneWrite(PIN, interval[scale]);

  delay((TEMPO/time)-20);
  softToneWrite(PIN, 0);
  delay(20);
}

int main()
{
  wiringPiSetup();
  softToneCreate(PIN) ;

  printf("***** U.N. Owen Was Her? *****\n");
  printf("             ZUN              \n");

  note(8,16);
  note(6,16);
  note(3,16);
  note(8,16);
  note(6,16);
  note(3,16);
  note(8,16);
  note(6,16);
  note(3,16);
  note(8,16);
  note(6,16);
  note(3,16);
  note(7,8);
  note(15,16);
  note(7,16);
  note(15,8);
  note(7,8);

  note(8,16);
  note(6,16);
  note(3,16);
  note(8,16);
  note(6,16);
  note(3,16);
  note(8,16);
  note(6,16);
  note(3,16);
  note(8,16);
  note(6,16);
  note(3,16);
  note(9,8);
  note(15,16);
  note(9,16);
  note(15,8);
  note(9,8);

  note(8,16);
  note(6,16);
  note(3,16);
  note(8,16);
  note(6,16);
  note(3,16);
  note(8,16);
  note(6,16);
  note(3,16);
  note(8,16);
  note(6,16);
  note(3,16);
  note(7,8);
  note(15,16);
  note(7,16);
  note(15,8);
  note(7,8);

  note(8,16);
  note(6,16);
  note(3,16);
  note(8,16);
  note(6,16);
  note(3,16);
  note(8,16);
  note(6,16);
  note(3,16);
  note(8,16);
  note(6,16);
  note(3,16);
  note(9,8);
  note(15,16);
  note(9,16);
  note(15,8);
  note(9,8);

  note(8,16);
  note(6,16);
  note(3,16);
  note(8,16);
  note(6,16);
  note(3,16);
  note(8,16);
  note(6,16);
  note(3,16);
  note(8,16);
  note(6,16);
  note(3,16);
  note(7,8);
  note(15,16);
  note(7,16);
  note(15,8);
  note(7,8);

  note(8,16);
  note(6,16);
  note(3,16);
  note(8,16);
  note(6,16);
  note(3,16);
  note(8,16);
  note(6,16);
  note(3,16);
  note(8,16);
  note(6,16);
  note(3,16);
  note(9,8);
  note(15,16);
  note(9,16);
  note(15,8);
  note(9,8);

  note(8,16);
  note(6,16);
  note(3,16);
  note(8,16);
  note(6,16);
  note(3,16);
  note(8,16);
  note(6,16);
  note(3,16);
  note(8,16);
  note(6,16);
  note(3,16);
  note(7,8);
  note(15,16);
  note(7,16);
  note(15,8);
  note(7,8);

  note(8,16);
  note(6,16);
  note(3,16);
  note(8,16);
  note(6,16);
  note(3,16);
  note(8,16);
  note(6,16);
  note(3,16);
  note(8,16);
  note(6,16);
  note(3,16);
  note(9,8);
  note(15,16);
  note(9,16);
  note(15,8);
  note(9,8);

  note(3,8);
  note(15,8);
  note(1,8);
  note(15,8);
  note(2,8);
  note(15,8);
  note(0,8);
  note(15,8);

  note(17,8);
  note(15,8);
  note(2,8);
  note(15,8);
  note(16,8);
  note(15,8);
  note(4,8);
  note(15,8);

  note(3,8);
  note(15,8);
  note(1,8);
  note(15,8);
  note(2,8);
  note(15,8);
  note(0,8);
  note(15,8);

  note(17,8);
  note(15,8);
  note(2,8);
  note(15,8);
  note(16,4);

  note(15,4);

  note(3,8);
  note(15,8);
  note(1,8);
  note(15,8);
  note(2,8);
  note(15,8);
  note(0,8);
  note(15,8);

  note(17,8);
  note(15,8);
  note(2,8);
  note(15,8);
  note(16,8);
  note(15,8);
  note(4,8);
  note(15,8);

  note(3,8);
  note(15,8);
  note(1,8);
  note(15,8);
  note(2,8);
  note(15,8);
  note(0,8);
  note(15,8);

  note(17,8);
  note(15,8);
  note(2,8);
  note(15,8);
  note(16,4);

  note(15,4);



  note(3,8);
  note(15,8);
  note(8,8);
  note(15,8);
  note(5,8);
  note(15,8);
  note(8,8);
  note(15,8);

  note(6,8);
  note(15,8);
  note(7,8);
  note(8,8);
  note(7,8);
  note(15,8);
  note(9,8);
  note(15,8);

  note(10,8);
  note(8,8);
  note(12,8);
  note(13,8);
  note(12,8);
  note(13,16);
  note(12,16);
  note(8,8);
  note(8,8);

  note(8,8);
  note(10,8);
  note(7,8);
  note(8,8);
  note(6,4);

  note(15,4);

  note(3,8);
  note(15,8);
  note(8,8);
  note(15,8);
  note(5,8);
  note(15,8);
  note(8,8);
  note(15,8);

  note(6,8);
  note(15,8);
  note(7,8);
  note(8,8);
  note(7,8);
  note(15,8);
  note(9,8);
  note(15,8);

  note(10,8);
  note(8,8);
  note(12,8);
  note(13,8);
  note(12,8);
  note(13,16);
  note(12,16);
  note(8,8);
  note(8,8);

  note(10,2);

  return 0;
}

Linuxで快適Arduino開発(Vim + Makefile)

どーもです。

 

夏休みになり、勝手に参加させてもらってる部活で「Arduino」を使うことになりました。

↑秋月LCD実験中

 

さて、Arduinoを動かすには「スケッチ」と呼ばれるプログラムを書かなければいけませんが、

 

標準エディタ使いにくい

 

Tabがすぐにスペースに変換されるとかホント許せないです。

ってことで快適にスケッチを書けないものかといろいろ粘った結果、

 

Vim + Makefile

 

が個人的に使い勝手が良かったので紹介します。

 

準備

Arduino IDEをインストールしておいてください。

MakefileがArduino 1.5.xに対応していないようなので、それ以外を選んでください。

また、MakefileのREADMEからの抜粋になりますが、自分の環境に合わせてパッケージを追加してください。

On Debian or Ubuntu:
   apt-get install libdevice-serialport-perl

On Fedora:
   yum install perl-Device-SerialPort

On openSUSE:
  zypper install perl-Device-SerialPort

On Mac using MacPorts:
   sudo port install p5-device-serialport

  and use /opt/local/bin/perl5 instead of /usr/bin/perl

 

Makefileを使えるようにする

Sudar氏の作成したArduino-Makefileを使わせてもらいました。

https://github.com/sudar/Arduino-Makefile

 

右側に「Download ZIP」ボタンがあるので、ここからダウンロードします。

 

僕はDocumentsフォルダにarduinoフォルダを作成し、その中に解凍して出てくる全てのファイル・フォルダをコピーし、さらにsourceフォルダを作成しました。

 

このsourceフォルダの中に、こんな感じでスケッチを書いていきます。

source
  ├─スケッチ01
  |   ├─スケッチ01.ino
  |   └─Makefile
  ├─スケッチ02
  |   ├─スケッチ02.ino
  |   └─Makefile
  └─スケッチ03
      ├─スケッチ03.ino
      └─Makefile

必ず、フォルダと中のスケッチのファイル名は同じにします。

 

Makefileの中身はこんな感じにします。他にもオプションはありますが、最低限コレだけ書いておけば問題ないです。

BOARD_TAG    = nano328
MONITOR_PORT = /dev/ttyUSB*
ARDUINO_LIBS =
AVR_TOOLS_DIR= /usr

include ../../arduino-mk/Arduino.mk

BOARD_TAG

そのまんまです。ここに開発しているArduinoの種類を書きます。

ここに書き込む文字列は、「make show_boards」とスケッチの入ったフォルダで実行するか、↓を参考にしてください。

uno
atmega328
diecimila
nano328
nano
mega2560
mega
leonardo
mini328
mini
ethernet
fio
bt328
bt
lilypad328
lilypad
pro5v328
pro5v
pro328
pro
atmega168
atmega8

 

MONITOR_PORT

Arduinoが接続されているデバイス名を書きます。

僕の環境(Fedora17 x86_64)だと、Unoは/dev/ttyACM*、Nanoは/dev/ttyUSB*でした。

 

ARDUINO_LIBS

ライブラリが置かれているディレクトリを書きます。

標準状態で/usr/share/arduino/librariesと/home/UserName/sketchbook/librariesを参照しているようなので、特に書き込む必要はないと思います。

 

AVR_TOOLS_DIR

avrdudeが入っているディレクトリを指定します。僕の場合は/usrでした。

 

VimでArduinoスケッチをシンタックスハイライトさせる

Sudar氏のvim-arduino-syntaxを使わせてもらいました。

https://github.com/sudar/vim-arduino-syntax

 

同様にzipファイルをダウンロードします。

 

ホームフォルダに「.vim」という名前でフォルダを作成し、先ほどダウンロードしたzipファイルを解凍して出てくる「ftdetect」と「syntax」フォルダを突っ込みます。

Linuxの世界ではファイル・フォルダ名の1文字目を「.」にすると隠しファイルの扱いになるので、ファイラーによっては設定を変更しないと表示されない場合があります。注意してください。

 

また、これは個人の好みによりますが、ホームフォルダに「.vimrc」という名前でファイルを作成し、中身にコレだけは書いておくことをおすすめします。

set autoindent
set smartindent

これで、自動インデントが有効になります。

その他の設定に関しては、Vimのブログが参考になるので、試してみるといいと思います。

 

これで、VimでArduinoのスケッチファイル(拡張子ino)を開くと色が付いているはずです。

 

ビルド&書き込み

スケッチのある(inoファイルのある)ディレクトリでTerminalを開き、

$ make

でビルドです。

AVR Memory Usage
----------------
Device: atmega328p

Program:    4092 bytes (12.5% Full)
(.text + .data + .bootloader)

Data:        501 bytes (24.5% Full)
(.data + .bss + .noinit)

こんな感じの文章が出力されたらビルド成功です。エラーが出たらスケッチを確認してください。

 

次は書き込みです。

$ make upload

で接続されたArduinoにスケッチを書き込むことができます。

 

 

 

一応全て書いたつもりですが、わからないことなどあったら遠慮なくコメントやTwitter、メールなどで連絡ください。(メールかTwitterの返事はかなり早いと思いますw)

では、快適なArduinoライフを〜