261
androidのイヤホン端子でモータを制御しようとしていて、イヤホン端子からPWMを出力する方法を探しています。
周波数はある程度高周波であればあまりこだわりません。
CC BY-SA 3.0
2014-12-02T06:10:13.003
238
2014-12-02T12:58:32.977
525
question
android
androidでイヤホン端子からPWMを出力したい
生成した音声バッファを直接再生できる android.media.AudioTrack はいかがでしょうか。

指定された長さ・周波数・デューティ比で矩形波を生成できるクラスを作成し、AudioTrack.OnPlaybackPositionUpdateListener
内の AudioTrack.onMarkerReached()が呼び出されるたびに波形を生成して流し込めるようにすればよいでしょう。

## 気をつけるべき事項

  * 生成波の理論的最高周波数はサンプリングレートの1/2

例えばCDと同じ44.1[kHz]で波形を出力する場合は、標本化定理から22.05[kHz]での出力が最高の周波数になります。ただ、この周波数に近づくにつれて波は台形に近くなり、最終的に三角波になります。(数kHzで必要十分だとは思いますが)

  * 波形バッファの長さは周波数に合わせて変える

ブラシレスモーター（特にステッピングモータ）の場合は、周波数が高くなると脱調しやすくなります。波形バッファが波長の整数倍でない場合、Listenerによってバッファを流し込む継ぎ目のところだけデューティ比が変わり、脱調を引き起こすかもしれません。

Androidでシンセサイザーやシグナルジェネレータを作っている人のサイトが多数存在するので、検索してみることをおすすめします。
CC BY-SA 3.0
2014-12-02T10:08:47.857
254
2014-12-02T10:08:47.857
197
238
answer
AudioTrackを使って簡単な矩形波を生成するコードを書いてみました。
<http://qiita.com/niusounds/items/beb0140117b9d3325ce7>
上記のOscillatorクラスで波形を生成する部分の

```

    double sin = Math.sin(2 * Math.PI * t * frequency);
    buffer[i] = sin > 0 ? 1 : -1;
    
```

で`sin > 0`を`sin > 0.25`とかにすればデューティ比が変わるんじゃないかと思います。
CC BY-SA 3.0
2014-12-02T12:58:32.977
261
2014-12-02T12:58:32.977
450
238
answer