フォト
サイト内検索
ココログ最強検索 by 暴想
2025年10月
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  
無料ブログはココログ

最近のトラックバック

にほんブログ村

  • にほんブログ村

« 2013年8月 | トップページ | 2013年10月 »

2013年9月

2013年9月 9日 (月)

PiFaceでクイズの早押しボタンのプログラムを作ってみた

またまた、単純なプログラムを作ってみましたが今回も楽しかったので本ブログに載せることにしました。
今回は、PiFaceでクイズの早押しボタンのプログラムを作ってみました。
PiFaceに載っているスイッチを早押しするとそれに対応したLEDが点滅(Lチカ)すると言うものです。
ピンポンと音まで出れば本格的なのでしょうがさすがにそこまでは私の技術では困難でした。
ボタン3つ(スイッチS1~S3)を回答者用に1つ(S4)をLED点滅のリセットとプログラム終了用としました。
プログラムを組んでみましたが、早押し部分にはボタンを押すと3つのif文によりLEDの点滅する関数に飛ぶと言うものです。
厳密には同時に押した場合、プログラムの作動上もっとも近いif文に当たったボタンのLEDが点滅すると言うことで必ずしもプログラム上は公平ではないのですが、ものすごい早さで検出するので実際の実用面では問題がないものと思われます。これは、ゲームなどのボタン操作でもおそらく同じ様なことが行われているものと推測されます。
さて、作ったプログラムを動作させてみてボタンの待ち受け時にCPUの使用量モニタで確認するとCPUの使用量が何と8割を越えてしまいます。実際、他のプログラムではボタンの待ち受けだけでこんなCPUの使用量となることはないでしょうから良いプログラムとは言えないかもしれません。
ファイル名「q_button.c」とし、gccによるコンパイルは、
$ gcc -L/usr/local/lib/ -lpiface-1.0 -o q_button q_button.c
で行いました。
以下はソースです。
/*クイズ早押しボタンです*/
#include <libpiface-1.0/pfio.h>
/*ファイルは/usr/local/include/libpiface-1.0/pfio.hにあります*/
void tennmetu(int led);/*led番で点滅する関数プロトタイプ(引数led、戻り値なし)*/
int main(void)
{
    int led=0;/*変数ledを宣言*/
        pfio_init();/*私には何のための関数か不明*/
 while(1) {/*ボタン待ち受け無限ループです*/
                if(pfio_digital_read(0)==1)tennmetu(2);/*スイッチS1が押されていれば関数tennmetu()に2を入れて実行*/
                if(pfio_digital_read(1)==1)tennmetu(3);/*スイッチS2が押されていれば関数tennmetu()に3を入れて実行*/
                if(pfio_digital_read(2)==1)tennmetu(4);/*スイッチS3が押されていれば関数tennmetu()に4を入れて実行*/
                if(pfio_digital_read(3)==1)break;/*スイッチS4が押されていれば無限ループを終了でプログラム終了*/
 }
       pfio_deinit();/*私には何のための関数か不明*/
}
void tennmetu(int led)
{
 while(1) {/*Lチカのための無限ループです*/
               pfio_digital_write(led, 1);/*LEDのled番を点灯*/
               usleep(50000);/*50000マイクロ秒間続ける*/
               pfio_digital_write(led, 0);/*LEDのled番を消灯(滅)*/
               usleep(100000);/*100000マイクロ秒間続ける*/
                if(pfio_digital_read(3)==1)break;/*スイッチS4が押されていれば無限ループを終了で点滅リセット*/
        }
        usleep(500000);/*スイッチS4の長押しでプログラム終了にならないよう時間を置く*/
}

2013年9月 4日 (水)

PiFaceでLEDの点滅(Lチカ)を速くしたり遅くしたり

 私はまだC言語初心者なのであまり大したことは出来ません。
 それでも、プログラミングが上手く行って楽しかったので載せることにしました。
 表題にもありますとおりPiFaceでLEDの点滅(Lチカ)をPiFaceに付いているスイッチで速くしたり遅くしたりするプログラミングです。
 LED2の点滅をし、(リレーに負担がかからないようリレーの無いLED2にしました。)
 スイッチのS1を押すとプログラムの終了。
 スイッチのS2を押すと点滅が速くなる。
 スイッチのS3を押すと点滅が遅くなる。
ものです。
 スイッチは消灯から点灯の瞬間のスイッチの状態で決まります。
 まだ、そんな単純なものしか組めません。
 gccによるコンパイルは以下のとおり実行しました。(どういう意味かは分かっていません。)
$ gcc -L/usr/local/lib/ -lpiface-1.0 -o piface_program2 piface_program2.c
下がソースです。
/*ファイル名はpiface_program2.cにしました。*/
#include <libpiface-1.0/pfio.h>
/*ファイルは/usr/local/include/libpiface-1.0/pfio.hにあります*/
void haya(void);/*点滅を速くするための関数プロトタイプ(引数、戻り値なし)*/
void oso(void);/*点滅を遅く関数プロトタイプ(引数、戻り値なし)*/
int ten=500000;/*点灯時間グローバル変数、0.5秒=500000マイクロ秒に設定*/
int metu=1000000;/*消灯(滅)時間グローバル変数、1秒=1000000マイクロ秒に設定*/
int main(void)
{
        pfio_init();/*私には何のための関数か不明*/
        while(1) {/*無限ループです*/
               pfio_digital_write(2, 1);/*LED2を点灯*/
               usleep(ten);/*tenマイクロ秒間続ける*/
               pfio_digital_write(2, 0);/*LED2を消灯(滅)*/
               usleep(metu);/*metuマイクロ秒間続ける*/
                if(pfio_digital_read(0)==1)break;/*スイッチS1が押されていれば無限ループを終了*/
                if(pfio_digital_read(1)==1)haya();/*スイッチS2が押されていれば関数haya()を実効*/
                if(pfio_digital_read(2)==1)oso();/*スイッチS3が押されていれば関数oso()を実効*/
        }
        pfio_deinit();/*私には何のための関数か不明*/
}
void haya(void)/*関数haya()本体*/
{
    if(ten<=50000)return;/*tenが50000マイクロ秒以下ならhaya()関数を終了(点滅があまり速くなりすぎないよう入れました。)*/
    ten=ten-(ten*0.1);/*点灯時間が10%速くします*/
    metu=metu-(metu*0.1);/*消灯時間が10%速くします*/
}
void oso(void)/*関数oso()本体*/
{
    if(ten>=550000)return;/*tenが550000マイクロ秒以下ならoso()関数を終了(点滅があまり遅くなりすぎないよう入れました)*/
    ten=ten+(ten*0.1111);/*点灯時間を11.11%遅くします*/
    metu=metu+(metu*0.1111);/*消灯時間を11.11%遅くします*/
}

2013年9月 1日 (日)

PiFace DigitalでのC言語によるLEDの点灯

 Raspberry Piの購入に合わせてPiFace Digital DEV-11772言うデジタルI/O拡張ボードもせんごくネット通販http://www.sengoku.co.jp/mod/sgk_cart/search.php?cid=4500で5,060円で購入しておりました。
 下の写真のRaspberry Piの上に載っているのがそれです。
Img_0310_14

 このボードには0番~7番の8つのLEDを点灯できるほか2つのリレーが載せられています。0番と1番のLEDは点灯するとリレーも動きます。
 私はこのPiFaceはGPIO端子で動くものだと思い込んで買ったのですが、そうではなく、SPIと言う汎用通信規格で動作するものと判明しました。右のWebページhttp://www.noveldevices.co.uk/rp-piface-2をWebページの翻訳機能と本の「Raspberry Piでつくる電子工作」工学社p107でわかりました。
 最初頭を抱えてしまったのですが各種Webページ、本の「Raspberry Piでつくる電子工作」で何とかC言語によるLEDの点灯、点滅(Lチカ)に成功したので報告したいと思います。
 まず、SPIを有効にする設定を行わなくてはなりません。Webページhttp://www.noveldevices.co.uk/rp-piface-2のStep1でテキストエディターのnanoで/etc/modprobe.d/raspi-blacklist.confファイルの編集をします。sudoで管理者権限を使わないとファイルの保存ができません。同じ様なことが「Raspberry Piでつくる電子工作」のp127“「SPI」を有効にする設定”に載っているのでこれも参考にして作業を行いました。
 その次の作業としてはhttp://www.noveldevices.co.uk/rp-piface-2のStepに則って作業をします。しかしながら、Step8までやってみたのですが、./piface_programを実行したところでエラーが発生してしまいました。
 そこで、何とかhttp://www.farnell.com/datasheets/1684425.pdfのp2に従ってPiFace Emulatorを動作させたところ(途中のinstall.txtは1行1行LXTerminalで実行する必要があります。)、PiFace Emulatorが下の写真のパネルと共に動作しました。

PiFace Emulatorを起動させてLEDの0番を点灯させたところ
Img_0312

PiFace Emulatorにより実際にPiFaceが点灯しているところ
Img_0311

 ここで再度、http://www.noveldevices.co.uk/rp-piface-2のStep7とStep8を実行したところLEDの1番が点灯しました。
 更に、C言語のソースを他のLチカと同じようにwhile()とsleep()関数を使って書き換えると点滅するようになりました。
 実際のところは色々試行錯誤をやっているのでこれで必ず繋がるとは限りませんが、私の様にStep7とStep8で上手くゆかなかった人は試してみてはどうでしょうか。

« 2013年8月 | トップページ | 2013年10月 »