アーカイブ
IOIO for Androidのアナログ入出力を試した
IOIOの10bit ADコンバータと10kHz PWM出力を試した。
今回のコード https://github.com/shokai/android-ioio-study/tree/master/AnalogInOut
Androidの画面上のシークバーを操作すると、PWMによる擬似的なアナログ出力でLEDの明るさを調整できる。
ブレッドボード上のCdSで明るさを計測して、Androidの画面上のシークバーの長さで表示したりした。

動画
■準備
まず久しぶりに秋葉原に行ったら秋月が改装工事中だったので、他の店を見て回った。IOIOの開発者が使っているピンヘッダを千石で発見したので買った。

このピンヘッダ、みっしりと敷き詰めるように装着できる。いつも使ってるメスピンヘッダは隣のピンにぶつかるので敷き詰められない。

これでブレッドボードに線を引き出す準備が整いました
■回路を作る
ブレッドボードに5Vか3.3Vと、GNDを引き出す。
4番ピンでデジタル入力を試すために、タクトスイッチを通して5Vを流し込む。IOIO内部でGNDにプルダウンするので直結で良い。ただし、Read This Before Connectingに書いてある通り5Vを入れて良いピンは決まっているのでよくわからなかったらブレッドボードに出すのは3.3Vにしておいた方が良い。
3番ピンをLEDに接続する。PWMを試すため。
アナログ入力は40番ピン周辺に16個ある。45番ピンにCdSをつけ、10kΩで分圧した。

■プログラムを書く
書いた。
AnalogInOutActivity.java
1からAndroidプロジェクトでIOIOを使う方法は前の記事を参考にされたし
このへんのドキュメント参考になる。
- Wiki: 'Digital I/O' for ytai's IOIO – Codaset
- Wiki: 'Analog Input' for ytai's IOIO – Codaset
- Wiki: 'PWM Output' for ytai's IOIO – Codaset
重要なのはAnalogInOutActivity.javaの49行目あたり。
class IOIOThread extends AbstractIOIOActivity.IOIOThread{
private DigitalOutput led;
private DigitalInput btn;
private PwmOutput pwm;
private AnalogInput ain;
protected void setup() throws ConnectionLostException{
led = this.ioio_.openDigitalOutput(0, true);
btn = this.ioio_.openDigitalInput(4, Mode.PULL_DOWN);
pwm = this.ioio_.openPwmOutput(3, 1000); // 1000hz
ain = this.ioio_.openAnalogInput(45);
}
protected void loop() throws ConnectionLostException{
try{
led.write(!btnLed.isChecked());
if(btn.read()) seekBarDigitalIn.setProgress(1);
else seekBarDigitalIn.setProgress(0);
pwm.setDutyCycle((float)seekBarPwm.getProgress() / seekBarPwm.getMax());
seekBarAnalogIn.setProgress((int) (ain.read() * seekBarAnalogIn.getMax()));
sleep(10);
} catch (InterruptedException e) {
}
}
}
DigitalInputはMode.PULL_DOWNにしておく。PwmOutputは1kHzに設定した(最大10kHz)
PWMもAnlogInputも、0〜1の間のfloat値で入出力値を扱う。Androidの画面のSeekBarは最大値を1000にしておいたので、IOIO上での値を1000倍してintにcastすればSeekBarに表示できる。
デジタル入力の状態をAndroidの画面上に表示する時、IOIOThreadからUI Threadを操作するとデッドロックが起きてアプリが停止するが、なぜかSeekBarはデッドロックが起きないので長さ1の小さなSeekBarを作ってデジタル値を表現するように工夫した。
ほんとうは「android.os.Handlerクラスのpost()を使え」、とyoggyさんが言っていたので今度やってみます。
moxaでバイオメタルを動かした
バイオメタルをmoxaで動かすために0V~3V程度を出せる回路とプログラムを作った。
色々試した結果、最終的にPCからシリアル通信でmoxaのanalogWrite(PWM出力)を制御できるようにして、analogWriteをトランジスタ(2SC1815)に突っ込む。トランジスタは三端子レギュレータ7805から得た5Vを出すが、トランジスタを通る事で3.7V程度に落ちて、バイオメタルにちょうど良い電圧になった。
バイオメタルは「3Vで駆動」と書いてあったけど3.7Vでも大丈夫だった。5Vそのまま入れると変な臭いがしてきてヤバイ(すぐ止めました)
AVRマイコンのGPIO出力は3Vだけど40mAと電流が足りなかった。
バイオメタルを動かすには200mA程度必要で、秋月の3.3Vの三端子レギュレータを使っても動いたけどマイコンから制御するためにトランジスタをかますと2V程度に落ちてしまうので5V電源でやったらちょうど良くなった。アクチュエータ系は試行錯誤が必要だなー
パソコンでアナログ値を制御している動画
回路。基盤で隠れて見えないけど、moxaの左下のGNDはブレッドボードのGNDと接続されている


今回のtalkticコード
xtel technical information > learning> Analog Read & Writeを参考にした
serialInit(9600);
pinMode(1,true);
pinMode(0,true);
power = 0.0;
function onSerialReceive(){ // シリアル受信イベント
while(serialAvailable()){ // 受信データがある時
var recvData = serialRead(); // 読み出し
power = recvData*0.01;
analogWrite(0, power);
analogWrite(1, power)
serialSend(recvData); // 受信した文字列をそのままエコーする
}
}
while(true){
}
PSoC DesignerでCY8C29466の16bitPWMを動かす
昨日は夕方にスタバに行って、PSoCいじってきました。
真ん中のLEDがPWMで0.3秒間隔ぐらいで点滅する。PWM(Pulse Width Modulation)はON/OFFの振幅幅を指定して自動的に波形を作るしくみの事で、カウントアップするタイマカウンタに対してduty値を指定してそれより大きい時は出力をHI、小さければLOWにする。
つまり波形を操作するにはduty値、カウントアップの間隔(システムクロックを分周したりして調節できる)、カウントアップの初期値、最大値、1クロックあたりのカウントアップ値、などのレジスタ(たいてい普通の変数として代入できる)を設定しなおす事で動的に波形を変える事が出来る。

PastelMagicの桑野さんが書かれた「はじめてのPSoCマイコン」の第1章 PSoCチュートリアル (p.25-53)を、PSoC MiniProgを買った時に付いてきたミニ評価ボード(CY3210-MiniEval1)にCY8C29466乗っけた版としてやってみた。
(この本ではCY8C27443を使っているが、ピンコンパチで上位版なので俺は29466をメインに使っていく予定)
CQ出版 (2004/11)
売り上げランキング: 137445

PSoCをはじめる一冊
$10マイコンがバージョンアップ!
PSoCの基本が解ります
ちなみに29466はGainerでも使われている。
■用意するもの
・プログラムを書くIDE → PSoC Designer(Cypressダウンロードページ)
・ISPライター制御プログラム → PSoC Programmer(Cypressダウンロードページ)
・PSoC C言語コンパイラ → 秋月電子通販
・PSoC MiniProg → 秋月電子通販
・CY8C29466 → 秋月電子通販


最近のコメント