電子趣味の部屋

電子系のガジェットやアプリ開発等の趣味の話題を書いてます

超簡単電子工作!ArduinoでPC98起動音を再現

NECの国民機 PC-98シリーズの起動音をArduinoで超簡単に再現してみました。

今回はArduino UNO R3を使用しましたが、特別なことはしていないので、何でもよいです。
またArduinoエントリーキットだけで作ることができるので、初めての方はこれがお勧めです。


他に用意したものは圧電スピーカーとタクトスイッチのみです。
接続は下の図のように、DIGITAL3番に圧電スピーカー、DIGITAL4番にタクトスイッチを接続しました。
圧電スピーカーとタクトスイッチは両方とも、反対のピンはGNDに接続しています。
このままではスピーカーによっては結構大きな音がするので、その場合は適当に抵抗を挟んでください。

この構成でタクトスイッチを押すと、PC98の起動音が鳴るようにします。

PC98の起動音について調べたところ、
2000Hz 1秒
1000Hz 1秒
のようです。

これをArduinoのtone関数で再現してみると

tone(3, 2000); // 3番ピンに接続されたスピーカーを2000Hzで鳴らす
delay(100);    // 100ms(1秒)待つ
tone(3, 1000); // 3番ピンに接続されたスピーカーを1000Hzで鳴らす
delay(100);    // 100ms(1秒)待つ
noTone(3);     // 3番ピンに接続されたスピーカーを止める

になります

これを適用した全ソースコードは以下になります。

int is_button = 0;

void setup() {
  pinMode(4, INPUT_PULLUP);  // DIGITAL4番ピン プルアップで入力
}

void loop() {
  if (digitalRead(4) == LOW) {
    is_button = 1;
  } else {
    if (is_button == 1) {
      // ボタンを押して離したときに実行
      tone(3, 2000); // 3番ピンに接続されたスピーカーを2000Hzで鳴らす
      delay(100);    // 100ms(1秒)待つ
      tone(3, 1000); // 3番ピンに接続されたスピーカーを1000Hzで鳴らす
      delay(100);    // 100ms(1秒)待つ
      noTone(3);     // 3番ピンに接続されたスピーカーを止める
    }
    is_button = 0;
  }
  
}

これだけです。
初めての方はこれを機にArduinoの手軽さを実感できたらと思います。

Arduino エントリーキット(Uno版)- Physical Computing Lab

Arduino エントリーキット(Uno版)- Physical Computing Lab

80年代マイコン大百科

80年代マイコン大百科

iOSでGS音源復活!SC-88proを再現したようなSoundCanvasがリリース

ハードウェア音源全盛期に定番だったRolandのGS音源のSoundCanvasがiOSアプリとしてリリースされました。

現在でもSC-88pro等の音源はオークションで頻繁に取引されています。
MIDIファイルの再生機能があるのでネットで公開されているファイルを再生して楽しめる他、CoreMIDIに対応しているので、MIDI機器と接続してそのまま音源としても楽しめます。
手持ちのIK Multimedia iRig KEYSを接続しただけで使用することができました。
MIDIファイルのプレイヤーとしても、そのままハードウェア音源としても使えるので、非常に便利です。

音色マップはSC-8820, SC-88Pro, SC-88, SC-55に対応しています。
チャンネル数は16チャンネルでPC-88Proより減っていますが、ほとんどのMIDIデータは16チャンネル以下で作られているので、軽く楽しむ分には問題はないと思います。
現在でもSC-8820を所有しているため、同じデータを聞き比べたところ、音は確かに同じです。
実機は古いので、かすかにノイズが乗ります。iOSはノイズが無い分実機よりクリアに聞こえました。

古くからのDTMファンは必須のアプリだと思います。

RolandからiOS版SoundCanvasがリリース!SC-88Pro音源が楽しめる!

Arduino ESPLORAでUSBマウス出力

今回もArdionoネタです。

携帯ゲーム機のような外観のArduino ESPLORAで遊びたいと思います。
こちらもATmega32u4を搭載し、USB機器にもなれるので、今回はESPLORAのジョイスティックとボタンでマウスを作ってみました。

ソースコード中にコメントで処理の説明を書いているので、参考にしてください

#include <Esplora.h>

void setup() {
  Mouse.begin();  // マウス開始
}

void loop() {
  int moveX = Esplora.readJoystickX(); // X軸のアナログ値を取得 (-512〜+512)
  int moveY = Esplora.readJoystickY(); // Y軸のアナログ値を取得 (-512〜+512)
  Mouse.move(-moveX / 100, moveY / 100, 0); // 適当に調整してマウスカーソルを移動
  if (Esplora.readButton(SWITCH_1) == LOW) {
    // SWITCH_1が押されているときの処理
    Mouse.press(MOUSE_LEFT); // 左ボタン押下送信
  } else {
    // SWITCH_1が押されていないときの処理
    Mouse.release(MOUSE_LEFT); // 左ボタン解放送信
  }
  if (Esplora.readButton(SWITCH_4) == LOW) {
    // SWITCH_4が押されているときの処理
    Mouse.press(MOUSE_RIGHT); // 右ボタン押下送信
  } else {
    // SWITCH_4が押されていないときの処理
    Mouse.release(MOUSE_RIGHT); // 右ボタン解放送信
  }
  // 適当にウェイトを入れる(お好みで調整してください)
  delay(5);
}

Arduino Esplora

Arduino Esplora

Arduino LEONARDOでUSBキーボード出力

今回はArdionoネタです。
ATmega32u4を搭載し、USB機器にもなれるArduino LEONARDOを入手したので、ちょっと遊んでみます。

USBキーボードとして接続されて、タクトスイッチを押すと、"TEST"と送信されるものを作ってみます。

配線は下の図のように、デジタル2番ピン-タクトスイッチ-Gndと接続しました。
図ではUNOとなっていますが、実際はLEONARDOです。

タクトスイッチの押下終了時に"TEST"を出力する処理のソースコードです

int key_enable = 1; // キー入力フラグ

void setup() {
  pinMode( 2, INPUT_PULLUP); // デジタル2ピンを内部プルアップ抵抗を有効にして出力に設定
  Keyboard.begin(); // キーボード開始
}
 
void loop() {
  if (digitalRead(2) == LOW) {
    // タクトスイッチを押している時はキー入力フラグを0にする
      key_enable = 0;
  } else {
    // 直前のキー入力フラグが0の時に文字列出力を実行する
    // (タクトスイッチの押下終了時に実行)
    if (key_enable == 0) {
      Keyboard.print("TEST");  // 文字列出力
      key_enable = 1;
    }
  }
}

これだけです。
キーボードだけではなく、マウスも簡単に扱えるので、Arduino LEONARDOは一番のお気に入りの機種になりました。

Swiftで簡単に折れ線グラフを書く方法

久しぶりにiOS SDKの開発メモです。
今回はSwiftで簡単に折れ線グラフを書く方法を紹介します。
簡単に使えるオープンソースのライブラリ BEMSimpleLineGraph を見つけたので、これを使います
BEMSimpleLineGraphはObjective-Cで書かれていますが、Swiftから使う方法を紹介します。

入手場所

BEMSimpleLineGraph
入手先はGitHubです。
どんな方法で入手しても良いですが、今回はこのページにある"Download Zip"ボタンによりZipファイルをダウンロードしました。

プロジェクト作成

今回は簡単に Single View Application で作ります。
プロジェクト名は"TestGraph"とします

ライブラリファイルをプロジェクトに追加

ダウンロードしたZip内のClassesフォルダにあるファイルをプロジェクトに追加します。
今回はLibフォルダを作成して、その中に追加しました

Bridging-Headerの追加

SwiftからObjective-Cのクラスを使うためにBridging-Headerを追加します
ファイル名は"TestGraph-Bridging-Header.h"とします。(<プロジェクト名>-Bridging-Header.h)
このファイルにBEMSimpleLineGraphのimport文を書きます

TestGraph-Bridging-Header.h

#import "BEMSimpleLineGraphView.h"

作成した"TestGraph-Bridging-Header.h"をBuild SettingsのSwift Compiler - Code Generationにある項目 Objective-C Bridge Headerに設定します

グラフ表示

簡単な例として、SampleLabelにX軸のラベル、SampleDataにY軸の値がセットされた要素数がそれぞれ5個の配列を用意して、この値をグラフ表示するコードを"ViewController.swift"へ書きます。
ライブラリの使い方はコード中のコメントを参考にしてください

import UIKit

// BEMSimpleLineGraphDelegateとBEMSimpleLineGraphDataSourceの2つのプロトコルを追加
class ViewController: UIViewController, BEMSimpleLineGraphDelegate, BEMSimpleLineGraphDataSource {
    
    // サンプルラベル
    var SampleLabel: Array<String> = ["ラベルA", "ラベルB", "ラベルD", "ラベルE", "ラベルF"]
    // サンプルデータ
    var SampleData:  Array<Float> = [10.5, 20.8, 5.3, 12.1, 25.9]
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // グラフのViewを作成(今回はメインビューと同じ大きさのビューを作ります)
        var GraphView: BEMSimpleLineGraphView = BEMSimpleLineGraphView(frame: CGRectMake(0, 0, self.view.bounds.width, self.view.bounds.height))
        // データソースを設定 (今回はこのクラスの中にメソッドを書くので、selfを設定)
        GraphView.dataSource = self
        // delegateを設定 (今回はこのクラスの中にメソッドを書くので、selfを設定)
        GraphView.delegate = self
        // メインビューにグラフのViewを追加
        self.view.addSubview(GraphView)
        
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }

    // グラフのX軸の最大個数を返すメソッドを作成
    func numberOfPointsInLineGraph(graph: BEMSimpleLineGraphView) -> NSInteger {
        // 今回はSampleData配列の数を返します
        return SampleData.count
    }
    
    // Y軸の値を返すメソッドを作成
    func lineGraph(graph: BEMSimpleLineGraphView, valueForPointAtIndex index: NSInteger) -> CGFloat {
        //何個目のX軸のポイントかはindexで取得できるので、今回はSampleData配列の中にあるindexの要素をそのまま返します
        return CGFloat(SampleData[index])
    }
    
    // X軸のラベルを返すメソッドを作成
    func lineGraph(graph: BEMSimpleLineGraphView, labelOnXAxisForIndex index: NSInteger) -> NSString {
        //何個目のX軸のポイントかはindexで取得できるので、今回はSampleLabel配列の中にあるindexの要素をそのまま返します
        return NSString(string: SampleLabel[index])
    }
    
}

これで下のように表示されます

グラフオブジェクトに対して下のような設定プロパティがあります

colorTop: UIColor グラフViewの上部の色
colorBottom: UIColor グラフViewの下部の色
colorLine: UIColor 各ポイントを結んだ線の色
colorXaxisLabel: UIColor X軸のラベルの文字の色
colorYaxisLabel: UIColor Y軸のラベルの文字の色
widthLine: CGFloat 各ポイントを結んだ線の太さ
enableTouchReport: Bool GraphViewのタッチイベントを取得するかどうか
enablePopUpReport: Bool 画面をタッチした時に値をポップアップで表示するか
enableBezierCurve: Bool 各ポイントを結ぶ線を滑らかに表示するか
enableYAxisLabel: Bool Y軸のラベルを表示するか
autoScaleYAxis: Bool Y軸をViewの高さに合わせてスケールするか
alwaysDisplayDots: Bool 各ポイントを常に表示するか
enableReferenceAxisFrame: Bool X, Y軸のフレーム(外枠)を表示するか
enableReferenceAxisLines: Bool X, Y軸の補助線を表示するか
animationGraphStyle: BEMLineAnimation 表示するときのアニメーション

いくつか設定してみた例です。

        // GraphView.delegate = self の次の行から以下を追加した例
        GraphView.enableYAxisLabel = true
        GraphView.enableXAxisLabel = true
        GraphView.enableReferenceAxisFrame = true
        GraphView.enableReferenceXAxisLines = true
        GraphView.enableReferenceYAxisLines = true
        GraphView.enableBezierCurve = false
        GraphView.widthLine = 2
        GraphView.colorLine = UIColor.orangeColor()
        GraphView.colorTop = UIColor.whiteColor()
        GraphView.colorBottom = UIColor.whiteColor()

表示してみました

このように非常に簡単に扱えるので、ちょっとした折れ線グラフを描きたいときに便利です。

詳解 Swift

詳解 Swift

HP-16cのカードサイズクローン機DM-16

今までずっとHP-16cが欲しくて探していました。
もう製造も終了した機種で、ebayでも3万円以上で取引されているものでずっと手が出ずにいました。
色々探してるうちにクローン機の存在を知り、ついに手に入れてしまいました。

こちらで販売しています。
SwissMicros | Home

送料も合わせると13,000円ほど、決して安くはないです。
HP-16cの機能はほぼ完全にエミュレートされているようです。プログラミングもできます。
キーは小さくて押しにくいですが、触ってて楽しいです。
他にもHP-11c,HP-12c,HP-15cのクローン機も販売しています。

なぜ一番有名なHP-15cではなく、HP-16cにこだわったかというと、2,8,10,16進数が相互にワンタッチで変換できることです。
HP-16cはもともとプログラマ向け関数電卓なので、プログラミングで使える事が非常に多いです。
詳しくはwiki
HP-10Cシリーズ - Wikipedia
を参考にしてください

現在このシリーズで手に入るのは、金融向け電卓のHP-12cだけです。

hp 12c Platinum ブラック 金融電卓 日マニュアル付

hp 12c Platinum ブラック 金融電卓 日マニュアル付