putixの日記

ガジェット好き。iPad mini とオンボロPC を使ってblog更新しています。

GPIO4(raspberry pi その13)

はじめての電子工作ステップ50
(日経linux 2014年11月号)

■ステップ28(音圧スピーカを鳴らす)
今までpython縛りで作っていましたが、
pythonではマイクロ秒のウェイト(スリープ)が正しく機能しないので
C言語を使うことにしました。pythonのウェイトは10msまでかなあ。
以下、テストソースと結果です。
>||
import datetime
import time

def func(t):
        L = []
        for i in range(0, 5):
                time.sleep(t)
                L.append(datetime.datetime.today())
        for i in L:
                print i

print "100ms"
func(0.1)

print "10ms"
func(0.01)

print "1ms"
func(0.001)

print "100us"
func(0.0001)
||<
#結果

100ms
2014-10-19 11:31:39.536018
2014-10-19 11:31:39.636575
2014-10-19 11:31:39.736987
2014-10-19 11:31:39.837402
2014-10-19 11:31:39.937889
10ms
2014-10-19 11:31:39.954346
2014-10-19 11:31:39.964743 # 10ms
2014-10-19 11:31:39.976092 # 12ms
2014-10-19 11:31:39.987933 # 11ms
2014-10-19 11:31:39.998360 # 11ms
1ms
2014-10-19 11:31:40.005250
2014-10-19 11:31:40.006618 # 1.4ms(厳しい)
2014-10-19 11:31:40.007916 # 1.3
2014-10-19 11:31:40.009290 # 1.3
2014-10-19 11:31:40.010642 # 1.4
100us
2014-10-19 11:31:40.016183
2014-10-19 11:31:40.016684 # 501us(ありえない)
2014-10-19 11:31:40.017087
2014-10-19 11:31:40.017478
2014-10-19 11:31:40.017941


しょうがないのでwiringPi入れます。

https://tool-lab.com/2013/12/raspi-gpio-controlling-command-2/

https://git.drogon.net/?p=wiringPi;a=tree;f=wiringPi;hb=HEAD

sudo apt-get install libi2c-dev
git clone git://git.drogon.net/wiringPi
cd wiringPi
sudo ./build

#インストール済みか確認
gpio -v

>||
#include <stdio.h>
#include <stdlib.h>
#include <wiringPi.h>

void ToneWrite(int pin, int freq)
{
    int halfPeriod = 500000 / freq ;
    int i;

    for(i=0; i<300*1000L; i+=halfPeriod)
    {
        digitalWrite (pin, HIGH);
        delayMicroseconds (halfPeriod);
        digitalWrite (pin, LOW);
        delayMicroseconds (halfPeriod);
    }
        delay(500);
}

int main(void)
{
    const int SPK = 25;
    const int scale[8] = {262, 294, 330, 349, 392, 440, 494, 525};
    int i;

    if(wiringPiSetupGpio() < 0)
    {
        printf("gpio error.\n");
        return EXIT_FAILURE;
    }

    for(i=0; i<8 ; i++)
    {
        printf("%03d\n", scale[i]);
        ToneWrite(SPK, scale[i]);
    }

    return EXIT_SUCCESS;
}
||<
gcc -o step28 step28.c -lwiringPi
sudo ./step28