Kevin

虫虫的痕迹!!!
  首页  :: 新随笔  :: 订阅 订阅  :: 管理

用普通PC主板的蜂鸣器给树莓派(RPI)加个报警器

Posted on 2015-01-30 12:07  KevinYao  阅读(1126)  评论(0编辑  收藏  举报

这两天有点时间,捣鼓了下那闲置好久的树莓派,把普通PC主板的蜂鸣器作为树莓派的报警器用。

Raspberry Pi有许多的GPIO(General Purpose Input Output:通用输入/输出),可以用来控制和读取数字电路中TTL电平的逻辑0和逻辑1。

我们要使用RPi的GPIO首先要知其GPIO的定义,常用的有两种编号定义:WiringPi Pin和BCM GPIO。

GPIO的驱动库我这里介绍两种给大家,一种为C语言的WiringPi,另一种为python的RPi.GPIO,本例使用的是WiringPi。

接线比较简单,把蜂鸣器的红线接GPIO1口(pin:12,即BCM_GPIO 18),黑线接GND(pin:6)。

至于为什么接GPIO1口,主要是因为树莓派只有这个口支持PWM输出。

pin编号如下图所示:

 

 

具体代码如下:

alarm.h

#include <wiringPi.h>

#define PIN_NO 1

int init();

void alarm(int count, int value, int interval);

void stopAlarm();

 

alarm.c

#include <stdio.h>
#include <stdlib.h>
#include "alarm.h"

static short isok;

int init(){
    if(!isok){
        if(wiringPiSetup() == -1){
            printf("WiringPi setup failed!\n");
            return 0;
        }else{
            isok = 1;
        }
    }
    return 1;
}

void alarm(int count, int value, int interval){
    if(!init())
        return;

    //printf("Speaker pin: GPIO%d\n",PIN_NO);

    pinMode(PIN_NO,PWM_OUTPUT);//设置引脚模式,模式为INPUT、OUTPUT 或者 PWM_OUTPUT,注意:仅wiringPi引脚1(即BCM_GPIO 18)支持PWM输出
    pwmSetMode(PWM_MODE_MS);
    //pwmSetRange(1024);
    
    int c;
    for(c = 0;c < count; c++){
        pwmWrite(PIN_NO,value);
        //printf("%d\n",count - c);
        delay(interval);
        pwmWrite(PIN_NO,-1);
        delay(interval);
    }

    stopAlarm();
}

void stopAlarm(){
    if(!init())
        return;

    pwmWrite(PIN_NO,-1);
    //pwmSetMode(PWM_MODE_BAL);
}

 

alarm_test.c

#include <stdio.h>
#include <stdlib.h>
#include "alarm.h"

int main(int argc, char *argv[])
{
    if(argc < 4){
        printf("arg error! At least 3 parameters!\n");
        return 1;
    }else{
        int count = atoi(argv[1]);
        int value = atoi(argv[2]);
        int interval = atoi(argv[3]);
        printf("Count:%d\tValue:%d\tInterval:%d\n", count, value, interval);
        printf("Alarm start!\n");
        alarm(count, value, interval);
        printf("Alarm complete!\n");
    }
    return 0;
}

 

编译:

gcc -c -o alarm.o alarm.c -lwiringPi
gcc -o alarm_test alarm_test.c alarm.o -lwiringPi

执行:

sudo ./alarm_test 10 1000 1000