本篇介绍orangePi+wiringPi库对蜂鸣器,继电器,超声波测距,舵机,OLCD屏等器件的操控。
蜂鸣器
实物图
对应接口(低电平触发蜂鸣)
蜂鸣器接口 orangepi接口
GND 9,25,6,14,20
I/O 3(SDA.3)
VCC 1,17(3.3V)
继电器
实物图
对应接口
orangepi接口 继电器接口
GND 9,25,6,14,20
I/O 3(SDA.3)
VCC 1,17(3.3V)
接线
超声波传感器
实物图
对应接口
超声波传感器接口 orangepi接口
VCC 2,4(5V)
GND 9,25,6,14,20
Trig 3(SDA.3)(程序初始化时,给Trig样板波>=10us)
Echo 5(SDL.3)(读取样板波的发送和接受信号)
发波:Echo,由低电平转到高电平
收波:Echo,由高电平转回低电平
收发波
舵机
实物图
对应接口
舵机接口 orangepi接口
黄(PWM信号) 11(PC6)
红(VCC) 2,4(5V)
灰(GND) 9,25,6,14,20
控制转角
黄色信号线发送PWM信号,PWM波50hz,f =1/50=0.02s,不同波形对应不同的旋转角度,以20ms为周期。
OLCD屏
对应接口
OLCD orangepi
vcc 2,4(5v)
gnd 9,25,6,14,20
sda 3
sdl 5
安装驱动
apt-get install i2c-tools -y
时间相关函数
获取时间
#include <sys/time.h>
int gettimeofday(struct timeval*tv, struct timezone *tz);
struct timezone{
int tz_minuteswest;/*格林威治时间往西方的时差*/
int tz_dsttime;/*DST 时间的修正方式*/
}
timezone 参数若不使用则传入NULL即可。
struct timeval{
long int tv_sec; // 秒数
long int tv_usec; // 微秒数
}
成功后返回0,失败后返回-1,错误代码存于errno中。
定时器
int setitimer(int which, const struct itimerval *value, struct itimerval *ovalue);
which:
ITIMER_REAL 此计时器实时倒计时。在每次到期时,都会生成一个SIGALRM信号。
ITIMER_VIRTUAL 此计时器根据进程消耗的用户模式CPU时间倒计时。(测量值包括CPU时间
由进程中的所有线程消耗。)在每次到期时,都会生成一个SIGVTALRM信号。
ITIMER_PROF 此计时器根据进程消耗的CPU总时间(即用户和系统)倒计时。(措施
ment包括进程中所有线程消耗的CPU时间。)在每次到期时,都会生成一个SIGPROF信号。此计时器与ITIMER_VIRTUAL结合使用,可用于配置用户和系统CPU消耗的时间过程
struct itimerval{
struct timeval it_interval; /*定时器循环时间*/
struct timeval it_value; /*距离定时器启动时间*/
};
struct timeval{
long tv_sec; /*seconds*/
long tv_usec; /*microseconds*/
};
ovalue用来保存先前的值,常设为NULL,备份。
编译脚本
build
#!/bin/bash
file=${1}
pro=`basename ${1} .c`
gcc ${file} -o ${pro} -lwiringPi
demo1:
orangePi控制蜂鸣器,发声一秒,间歇两秒
代码示例:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <wiringPi.h>
#define BEEP 0
void result()
{
if(wiringPiSetup() == -1)
{
printf("init pi fail\n");
exit(-1);
}
pinMode(BEEP,OUTPUT);
digitalWrite(BEEP,HIGH);
while(1)
{
digitalWrite(BEEP,LOW);
sleep(1);
digitalWrite(BEEP,HIGH);
sleep(2);
}
}
int main()
{
result();
return 0;
}
demo2:
orangepi控制继电器开关,输入1闭合开关,输入0断开
代码示例:
#include <stdio.h>
#include <stdlib.h>
#include <wiringPi.h>
#define SW 0
void result()
{
int num;
if(wiringPiSetup() == -1)
{
printf("init pi fail\n");
exit(-1);
}
pinMode(SW,OUTPUT);
digitalWrite(SW,HIGH);
while(1)
{ printf("input 1 or 0:\n");
scanf("%d",&num);
if(num == 1)
{
digitalWrite(SW,LOW);
}
else if(num == 0)
{
digitalWrite(SW,HIGH);
}
else
{
printf("input error,input again:\n");
}
}
}
int main()
{
result();
return 0;
}
代码结果示例:
demo3:
orangepi控制超声波测距,测量手与器件之间的距离
代码示例:
#include <stdio.h>
#include <stdlib.h>
#include <wiringPi.h>
#include <sys/time.h>
#include <unistd.h>
#define Trig 0
#define Echo 1
void init_ultrasonic()
{
pinMode(Trig,OUTPUT);
pinMode(Echo,INPUT);
digitalWrite(Trig,LOW);
usleep(5);
digitalWrite(Trig,HIGH);
usleep(10);
digitalWrite(Trig,LOW);
}
double dis()
{
struct timeval start;
struct timeval end;
long diff;
double distance;
init_ultrasonic();
while(!digitalRead(Echo));
gettimeofday(&start,NULL);
while(digitalRead(Echo));
gettimeofday(&end,NULL);
diff = 1000000*(end.tv_sec - start.tv_sec) + (end.tv_usec - start.tv_usec);
distance = (double)diff/1000000 * 34000;
return distance;
}
void result()
{
double distance;
if(wiringPiSetup() == -1)
{
printf("init pi fail\n");
exit(-1);
}
while(1)
{
distance = dis();
printf("distance : %lf cm\n",distance);
sleep(1);
}
}
int main()
{
result();
return 0;
}
代码结果示例:
demo4:
orangepi控制舵机旋转角度,1--0度, 2-- 45 度,3-- 90 度,4-- 135度, 5--180度
代码示例:
#include <stdio.h>
#include <stdlib.h>
#include <wiringPi.h>
#include <unistd.h>
#include <sys/time.h>
#include <signal.h>
#define STEER 5
int i = 0;
int angle;
void sighandler_t(int signal_num)
{
if(i <= angle)
{
digitalWrite(STEER,HIGH);
}
else
{
digitalWrite(STEER,LOW);
}
if(i == 40)
{
i = 0;
}
i++;
}
void init_pi()
{
if(wiringPiSetup() == -1)
{
printf("init pi fail\n");
exit(-1);
}
pinMode(STEER,OUTPUT);
}
void result()
{
struct itimerval itv;
itv.it_interval.tv_sec = 0;
itv.it_interval.tv_usec = 500;
itv.it_value.tv_sec = 1;
itv.it_value.tv_usec = 0;
setitimer(ITIMER_REAL,&itv,NULL);
init_pi();
signal(SIGALRM,sighandler_t);
while(1)
{
printf("input num : 1-0 , 2-45 , 3-90 , 4-135 , 5-180\n");
scanf("%d",&angle);
}
}
int main()
{
result();
return 0;
}
代码结果示例:
demo5:
修改pi库oled_demo.c,在OLCD屏上显示两行字母hello word与hello and word
预装及编译
apt-get install i2c-tools -y
./build test.c
./a.out /dev/i2c-3
代码示例:
#include <errno.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <stdint.h>
#include "oled.h"
#include "font.h"
int oled_demo(struct display_info *disp) {
char buf[100];
oled_putstrto(disp, 0, 10, "hello word");
disp->font = font2;
oled_putstrto(disp, 0, 25, "hello and word");
disp->font = font2;
oled_send_buffer(disp);
return 0;
}
void show_usage(char *progname) {
printf("\nUsage:\n%s <I2C bus device node >\n", progname);
}
int main(int argc, char **argv) {
char filename[32];
struct display_info disp;
if (argc < 2) {
show_usage(argv[0]);
return -1;
}
memset(&disp, 0, sizeof(disp));
sprintf(filename, "%s", argv[1]);
disp.address = OLED_I2C_ADDR;
disp.font = font2;
oled_open(&disp, filename);
oled_init(&disp);
oled_demo(&disp);
return 0;
}